在使用SQLite3时遇到的几个坑

这是我在一个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;');
?>

希望对你有所帮助。

阅读余下内容
 

《 “在使用SQLite3时遇到的几个坑” 》 有 2 条评论

  1. 摘要:从200万元的“天价之吻”到最新35万元的车损估算,事发温州的这场雅阁刮擦1200万元劳斯莱斯,着实向许多人展示了一个意想不到的尴尬剧:豪华车真的碰不得,搭上了倾家荡产都不够赔。 浙江在线-今日早报2月8日报道 从200万元的”天价之吻”到最新35万元的车损估算,事发温州的这场雅阁刮擦1200万元劳斯莱斯,着实向许多人展示了一个意想不到的尴尬剧:豪华车真的碰不得,搭上了倾家荡产都不够赔。 不过,即便是这初步估价的35万元,肇事的雅阁车主心底一定也暗暗叫苦,虽然不用砸锅卖铁来修车,但自己这辆雅阁还是得赔掉了。 即便是肇事者,雅阁车主朱小姐的遭遇却让大家同情幸好劳斯莱斯4S

  2. 摘要:今后,在道路交通安全法中,机动车撞人负全责的规定或许将成为历史。今后,机动车和行人也许将会按照各自在交通事故中的责任大小,按照比例承担赔偿责任。10月2 今后,在道路交通安全法中,机动车撞人负全责的规定或许将成为历史。今后,机动车和行人也许将会按照各自在交通事故中的责任大小,按照比例承担赔偿责任。10月24日,十届全国人大常委会第三十次会议开始审议由国务院提交的道路交通安全法修正案草案。据悉,草案对现行道路交通安全法第76条第1款第2项进行了修改,机动车与非机动车、行人发生交通事故时,机动车无责的情况下最高赔偿10%。  车撞人拟按比例赔偿  本次草案中指出,有证据证明非机动车驾驶人、

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号