这是我在一个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属性,就像下面这样:
$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;');
?>
希望对你有所帮助。