在插入期间SQLite错误'尝试编写只读数据库'?

问题描述 投票:111回答:8

我有一个我用于网站的SQLite数据库。问题是,当我尝试INSERT INTO它,我得到一个PDOException

SQLSTATE[HY000]: General error: 8 attempt to write a readonly database

我通过SSH连接到服务器并检查权限,数据库具有权限

-rw-rw-r--

我不熟悉* nix权限,但我很确定这意味着

  • 不是目录
  • 所有者具有读/写权限(根据ls -l,这就是我)
  • 组具有读/写权限
  • 其他人只有读取权限

我也看到了我知道使用sqlite3程序的所有地方,并没有发现任何相关内容。

因为我不知道PDO试图打开数据库的权限,我做到了

chmod o+w supplies.db

现在,我得到另一个PDOException

SQLSTATE[HY000]: General error: 14 unable to open database file

但它只会在我尝试在数据库打开后执行INSERT查询时发生。

关于发生了什么的任何想法?

sqlite permissions
8个回答
285
投票

事实证明,问题是PDO SQLite驱动程序要求如果你要进行写操作(INSERTUPDATEDELETEDROP等),那么数据库所在的文件夹必须具有写权限,如以及实际的数据库文件。

我在comment at the very bottom of the PDO SQLite driver manual page中找到了这些信息。


13
投票

当SQLite文件的所有者本身与运行脚本的用户不同时,就会发生这种情况。如果无法写入整个目录路径(意味着沿途的每个目录),则会发生类似的错误。

谁拥有SQLite文件?您?

脚本运行的是谁? Apache还是没人?


5
投票

对我来说,问题是SELinux enforcement而不是权限。根据Steve V.在对the accepted answer.的评论中提出的建议,一旦我禁用执法,“只读数据库”错误就消失了

echo 0 >/selinux/enforce

运行此命令后,一切都按预期工作(CentOS 6.3)。

我遇到的具体问题是在Graphite的设置过程中。我已经三次检查了apache用户拥有并可以写入我的graphite.db及其父目录。但在我“修复”SELinux之前,我得到的只是一个堆栈跟踪效果:DatabaseError:尝试编写只读数据库


3
投票

这可能是由SELinux引起的。如果您不想完全禁用SELinux,则需要将db目录fcontext设置为httpd_sys_rw_content_t。

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?"
restorecon -v /var/www/railsapp/db

1
投票

我在Windows 7下从IIS得到了同样的错误。要修复此错误,我必须为sqlite数据库文件的IUSR帐户添加完全控制权限。如果在webmatrix而不是IIS下使用sqlite,则无需更改权限。


1
投票

当我尝试写入Android系统上的数据库时出现此错误。

显然sqlite3不仅需要对数据库文件和包含目录的写权限(正如@ austin-hyde在他的回答中已经说过的那样),而且环境变量TMPDIR必须指向(可能是可写的)目录。

在我的Android系统上,我将其设置为TMPDIR="/data/local/tmp",现在我的脚本按预期运行:)

编辑:

如果您无法设置环境变量,可以使用此处列出的其他方法之一:https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations,如PRAGMA temp_store_directory = 'directory-name';


0
投票

总之,我通过将数据库文件(* .db)放在子文件夹中来解决问题。

  • 子文件夹及其中的数据库文件必须是www-data组的成员。
  • 在www-data组中,您必须有权写入子文件夹和数据库文件。

-2
投票

当我从使用http://localhost更改为http://145.900.50.20(其中145.900.50.20是我的本地IP地址)然后更改回localhost时,我在浏览器中得到了此信息 - 一旦我更改为一次,就必须保留IP地址

© www.soinside.com 2019 - 2024. All rights reserved.