有哪些基本步骤可以解决并缩小Django中“django.db.utils.ProgrammingError:关闭django_migrations关闭权限”错误的原因?
我在最初的稳定生产服务器之后得到了这个消息,但后来对Django,Postgres,Apache和Github的一些方面进行了一些更改。此外,这些更改已经有一段时间了,我不记得或无法追踪可能导致问题的每一个变化。
当我运行python manage.py runserver
或除python manage.py ...
之外的任何其他python manage.py check
命令时,我收到消息,表明系统正常。
答案 0 :(得分:71)
我能够根据此question的说明解决我的问题。基本上,需要将postgres特权重新授予db用户。就我而言,那是我在虚拟环境设置文件中设置的用户。从命令行(或postgres)运行以下命令,其中mydatabase
和dbuser
应该是您自己的数据库和用户名:
psql mydatabase -c "GRANT ALL ON ALL TABLES IN SCHEMA public to dbuser;"
psql mydatabase -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to dbuser;"
psql mydatabase -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to dbuser;"
答案 1 :(得分:2)
如@ user3062149所述,这可能是由于尝试迁移Django的psycopg2用户不是表所有者的数据库表引起的。例如,如果您在项目的settings.py
DATABASES = {
'default': {
'USER': 'my_username',
# ...
您将需要检查Django迁移中涉及的表是否由my_username
拥有。要在psql
中执行此操作,可以使用SELECT * FROM pg_tables ORDER BY tableowner;
。这使用视图pg_tables
,该视图“提供对数据库中每个表的有用信息的访问”。 pg_tables
是Postgres的system catalogs(关系数据库管理系统存储架构元数据的地方)的一部分。
假设该表归other_username
(而不是my_username
)所有。
要更新所有者,您需要先用psql
调用--username=other_username
,然后更改所有者:
ALTER TABLE public.<table_name> OWNER TO my_username;
答案 2 :(得分:2)
如果您收到此错误,并且正在使用Heroku托管平台,则很可能您试图写入行数有限的Hobby级别数据库。
即使您超出了限制,Heroku仍允许您pg:push
数据库,但是它是只读的,因此对内容的任何修改都不会被处理,并且会引发此错误。