【问题标题】:Attempt to write to a readonly database error尝试写入只读数据库错误
【发布时间】:2016-10-20 05:07:42
【问题描述】:

我创建了一个新的 Laravel 应用程序,使用 SQLite 数据库作为用户登录系统。我遇到了一个奇怪的问题,我收到以下错误:

> SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
> (SQL: update "users" set "remember_token" =
> HH0dtQYZ5BgoOpya1hNRUrFvIZF0dcYqdIvAjz0k6CbTKBqah7wWPdQbgzzL,
> "updated_at" = 2016-06-18 12:47:43 where "id" = 1)

我最初认为我的 SQLite db 文件存在一些权限问题,但是正确的用户有权访问该文件,并且我已将 chmod 设置为 755。 该问题仅在第一次登录时出现,如果我刷新页面(并重新发送表单数据)应用程序登录成功。对于我的应用程序中的任何其他数据库操作,我都没有遇到此问题。

【问题讨论】:

标签: php sqlite laravel


【解决方案1】:

对于可能需要此功能的任何人,检查您的文件权限

如果您的 database.sqlite 文件在 database/ 下,请将权限设置为 775(755 对我不起作用)。

$ chmod -R 775 database

将组设置为www-data 并将所有者设置为您自己也可能是值得的。

$ chgrp -R www-data database
$ chown -R USERNAME database

显然将database 替换为您的.sqlite 数据库所在文件夹的路径。还要检查任何迁移命令后的权限,或passport:install。我确定这是用户错误,但有一次我以为我已经递归地设置了目录的文件权限,但实际的 .sqlite 文件不知何故恢复为 644 并且所有者和组都是我的用户。

这可能只是因为我弄乱了构建脚本,但我的意思是 - 检查第二次比挖掘 SO 问题要快。

另外值得注意的是,如果您的某些路由正常工作,但其他路由因 500 错误而失败,请检查您的表中是否确实至少有 1 行数据。我建议创建播种器并运行php artisan passport:install 以生成一些初始数据。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      PDO sqlite 要求您将目录设置为读/写权限。 为此,请在数据库路径前添加 chown www-data。

      const sequelize = new Sequelize({
        dialect: 'sqlite',
        storage: ' chown www-data ./dev-module/database/database.sqlite',
        syncOnAssociation: true,
      });
      

      【讨论】:

        猜你喜欢
        • 2015-10-27
        • 2017-09-27
        • 2018-05-23
        • 2021-09-11
        • 2016-08-16
        • 2017-07-17
        • 2011-03-20
        • 2021-05-01
        相关资源
        最近更新 更多