SQLite:只读数据库

我有一个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查询时才会发生。

任何想法正在发生什么?

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

我在PDO SQLite驱动程序手册页的底部发现了这个信息。

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

谁拥有SQLite文件? 您?

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

对我来说,这个问题是SELinux执行而不是权限。 一旦我禁用了执行的“只读数据库”错误后,Steve V.在对已接受的答案发表了评论。

 echo 0 >/selinux/enforce 

一旦运行这个命令,一切都按照预期运行(CentOS 6.3)。

我遇到的具体问题是在安装Graphite期间。 我已经三重检查了Apache用户拥有,并可以写入我的graphite.db和它的父目录。 但直到我“固定”SELinux,我得到的是一个堆栈跟踪的效果: DatabaseError:试图写一个只读数据库

这可能是由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 

我得到了同样的错误从Windows 7下的IIS。要解决这个错误,我不得不完全控制权限添加到IUSR帐户的SQLite数据库文件。 如果您在webmatrix下使用sqlite而不是IIS,则不需要更改权限。

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

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

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

当我从http:// localhost更改为http://my.local.ip.address ,然后又改回本地主机时,我在浏览器中得到了这个信息 – 一旦我改变了IP地址那一次