Laravel + SQLite = SQLSTATE[HY000]General Error: 8 尝试写入只读数据库的错误

18

我想删除一个db.sqlite文件,再次创建它,然后在同一个方法中将一些信息插入到此数据库中。这是我正在使用的方法:

public function destroy()
{
    // Store all contents and delete the first one since this is created via seeder
    $contents = $this->contents->all()->toArray();
    array_shift($contents);

    // Delete db file, creates it from an example file and changes permissions
    system('rm -rf ../database/database.sqlite');
    system('cp ../database/database.sqlite.example ../database/database.sqlite');
    system('chmod 0777 ../database/');
    system('chmod 0777 ../database/database.sqlite');

    // Insert data
    foreach ($contents as $content) {
        $this->contents->create($content);
    }

    return response()->json(['message' => 'Data has been destroyed!']);
}

但是,当我尝试运行它时,我会收到标题中描述的错误:

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

我按照其他问题答案的建议将文件和文件夹权限设置为777,因此我不知道为什么它不能正常工作。


可能是SQLite:只读数据库的重复问题。 - MCMXCII
@MCMXCII 我差点将这个问题标记为重复,但是问题提交者在最后一行确实声明:“我正在为文件和_文件夹_赋予777权限。” - cteski
@cteski 对不起,我没看到那个。 - MCMXCII
5个回答

36

您需要运行两个命令

首先,将 Laravel 目录所有权更改为 web 组:

sudo chown -R :www-data /var/www/yourLarvelFolder

其次,赋予 storage 目录权限以便可以进行写入操作:

sudo chmod -R 775 /var/www/yourLarvelFolder/storage


4
在 Ubuntu 18.04 上使用 Laravel 6,可以在此处授予权限。
sudo chmod -R 775 database
sudo chown -R $(whoami) database

2

如果您使用的是 Fedora 或 Redhat 操作系统并且开启了 Selinux,请务必关闭它(或正确配置):

setenforce 0

1

最终我通过使用两种不同的方法解决了这个问题,第一种方法是删除数据库并重新创建(返回所有内容),然后第二种方法是将所有内容插入到新的数据库中。


1

首先运行以下命令检查apache2的用户。通常它是www-data。

ps aux | grep "apache2"

然后运行以下命令来解决您的问题。

chgrp -R www-data your_application_directory
chmod -R g+rw your_application_directory

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