在使用SQLite3时遇到的几个坑

来源:07素材网 04月02日 18:05

这是我在一个SQLite3数据库上执行exec时遇到的奇怪问题!


在使用SQLite3时遇到的几个坑


本打算在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属性,就像下面这样:
busyTimeout(5000);
// WAL mode has better control over concurrency.
// Source: https://www.sqlite.org/wal.html
$db->exec('PRAGMA journal_mode = wal;');
?>
希望对你有所帮助。
原文出处:https://www.webhek.com/post/php-with-sqlite3-problem.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。

头条

在使用SQLite3时遇到的几个坑

在使用SQLite3时遇到的几个坑

《本打算在SQLite3数据库里执行一个查询语句,使用的是php语言,起初遇到的是权限问题: permission denied,因为SQLite3数据库文件和PHP执行者属于两个不同的用户,首先需要对这个文件执行mode 777的权限开放,然后,又遇到了下面这样的PHP错误