提问人:Tornike k 提问时间:11/2/2023 最后编辑:Tornike k 更新时间:11/2/2023 访问量:44
如何解决django OperationalError - 尝试编写只读数据库?
how to solved django OperationalError - attempt to write a readonly database?
问:
我在 linux(digitalocean) 中有 Django web,并使用 sqlite3。我有三个用户sqlite3。
当我使用:python3 manage.py runserver 0.0.0.0:8000 -->一切都很好时。
但是当我使用: sudo systemctl restart apache2 --> 当我打开用户登录页面和登录时,我收到错误:尝试写入只读数据库。
我试过了:
- sudo chmod a+w db.sqlite3
- chown apache:apache db.sqlite3
文件夹结构:
-myproject
--projectenv
--myapp
----myapp
----firstapp
----manage.py
----db.sqlite3
数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
答:
1赞
CoffeeBasedLifeform
11/2/2023
#1
在处理过程中,Sqlite会写入一堆临时文件,因此Apache需要对sqlite将这些文件写入的目录的写入权限 - 该目录可以是包含数据库文件的目录(在您的情况下)。
https://www.sqlite.org/tempfiles.htmlmyapp
如果您的情况允许,仅出于测试目的,请尝试授予每个人对包含您的数据库的目录的完全访问权限:。
如果这样可以解决您的问题,则可以将数据库文件移动到单独的目录中,并授予 apache 该目录的所有权,以获得更明智的解决方案。chmod 777 myapp
评论
0赞
Tornike Kharitonishvili
11/3/2023
如果我使用 chmod 777 myapp 和 chmod 664 db.sqlite3 -->一切都很好。但是,这个建议是:使用 chmod 777 myapp 吗?
0赞
CoffeeBasedLifeform
11/3/2023
不,绝对不是。你只需要给apache(通常用用户名)写权限到sqlite想要将临时文件写入的目录(目录见这里)。有不同的方法可以解决这个问题。例如,您可以将目录的所有权授予 apache (),或者您可以授予组的写入权限,然后将 apache 分配给该组,或者将自己分配给 apache 的组并将 apache 的组分配给该目录。www-data
chown www-data:www-data
0赞
CoffeeBasedLifeform
11/3/2023
需要明确的是:“chmod 777”从来都不是一个好主意。以下是解决您的问题的更多提示: serverfault.com/questions/57596/...
0赞
Tornike Kharitonishvili
11/3/2023
谢谢。我将详细阅读上述问题。
1赞
CoffeeBasedLifeform
11/3/2023
这似乎是一个明智的解决方案:serverfault.com/a/499207 他们 1.)将文件移动到子文件夹 2.)授予 Apache 该子文件夹的所有权,3.)将自己添加到 Apache 组,然后 4.)授予对该组的写入权限。
评论
ls -la db.sqlite3