插入数据时出现“尝试写入只读数据库”的SQLite错误?

156

我有一个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查询时才会出现此问题。

您对发生了什么有任何想法吗?


基本上,httpd(Apache > PHP > PDO)不是您,因此它不拥有该文件,因此它没有写入权限......有趣... - SparK
sudo chgrp www-data test.db 并添加权限对我有用。 - Zippp
如果您尝试访问已删除的数据库,也会显示此错误。 - ignacio
13个回答

0

这些解决方案都对我没用,我想我遇到了一个很罕见的情况。由于停电,即使文件夹和数据库文件有777权限且没有SELinux,我仍然会收到此错误。

结果发现有一个名为jellyfin.pid的文件(不确定它是以服务或用户命名的,因为它们具有相同的名称)在停电后锁定了它。删除它,重新启动服务,一切正常。


0

以上都不是我的情况。事实证明容器文件夹由root所有,并且具有粘滞位('drwxrwxrwt'),而sqlite数据库由其他用户所有。尝试向表格插入数据的进程在root用户下运行。因此,以下任一方法都可行:

  • 移除粘滞位
  • 将运行该进程的用户与sqlite db文件的所有者设置为相同。

-1
当我从使用http://localhost更改为http://145.900.50.20(其中145.900.50.20是我的本地IP地址),然后再更改回localhost时,在我的浏览器中出现了这个问题--一旦我更改为IP地址,就必须保持使用该IP地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接