这是我在一个SQLite3数据库上执行exec时遇到的奇怪问题!
本打算在SQLite3数据库里执行一个查询语句,使用的是php语言,起初遇到的是权限问题: permission denied,因为SQLite3数据库文件和PHP执行者属于两个不同的用户,首先需要对这个文件执行mode 777的权限开放,然后,又遇到了下面这样的PHP错误:
"SQLite3::exec(): unable to open database file in ...."
多试试几次后偶然也会出现”database locked”的错误提示。
经过了糟心的无数次各种方式的debugging后,最后才发现,需要将SQLite3数据库文件所在的目录的权限也开放给php执行者的用户。
这显然是毫无意义的,然而这就是报错的根源。
至少错误提示信息应该更清晰些吧。
不清楚为什么SQLite3需要开放整个目录的权限,而不是单个数据库文件的权限,有点愚蠢,是个bug?
还有一个问题就是”database locked”的错误。有时候是因为多个程序同时操作一个数据库导致的数据锁。
这个时候需要使用一些SQLite3的特别命令(i.e. using PRAGMA keyword)。例如,在解决我遇到的”database locked”问题上,我是将journal_mode
的缺省的delete
值替换成wal
,你可以在 https://www.sqlite.org/wal.html里查看相关文档(看 Activating And Configuring WAL Mode部分)。
需要做的就是创建一个链接,使用sql语句设置journal_mode
属性,就像下面这样:
<?php $db = new SQLite3('/my/sqlite/file.sqlite3'); $db->busyTimeout(5000); // WAL mode has better control over concurrency. // Source: https://www.sqlite.org/wal.html $db->exec('PRAGMA journal_mode = wal;'); ?>
希望对你有所帮助。