解决“django.db.utils.ProgrammingError:关闭django_migrations的权限被拒绝”的步骤

时间:2016-08-14 17:06:55

标签: python django apache postgresql github

有哪些基本步骤可以解决并缩小Django中“django.db.utils.ProgrammingError:关闭django_migrations关闭权限”错误的原因?

我在最初的稳定生产服务器之后得到了这个消息,但后来对Django,Postgres,Apache和Github的一些方面进行了一些更改。此外,这些更改已经有一段时间了,我不记得或无法追踪可能导致问题的每一个变化。

当我运行python manage.py runserver或除python manage.py ...之外的任何其他python manage.py check命令时,我收到消息,表明系统正常。

3 个答案:

答案 0 :(得分:71)

我能够根据此question的说明解决我的问题。基本上,需要将postgres特权重新授予db用户。就我而言,那是我在虚拟环境设置文件中设置的用户。从命令行(或postgres)运行以下命令,其中mydatabasedbuser应该是您自己的数据库和用户名:

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数据库,但是它是只读的,因此对内容的任何修改都不会被处理,并且会引发此错误。