对于“django.db.utils.ProgrammingError:django.db.utils.ProgrammingError:关系django_migrations的权限被拒绝“Django的错误?
我收到这条消息是在一个最初稳定的生产服务器,但后来Django,Postgres,Apache的一些方面发生了一些变化,并从Github中拉出来。另外,这些变化已经有一段时间了,我不记得或不能跟踪可能导致问题的每一个变化。
当我运行python manage.py runserver
或除python manage.py check
之外的任何其他python manage.py ...
命令时,我收到消息,表明系统正常。
5条答案
按热度按时间az31mfrm1#
我能够根据这个question的说明解决我的问题。基本上,postgres权限需要重新授予db用户。在我的例子中,这是我在虚拟环境设置文件中设置的用户。从命令行(或在postgres中)运行以下命令,其中
mydatabase
和dbuser
应该是您自己的数据库和用户名:jdg4fx2g2#
正如@user3062149所提到的,这可能是由于试图迁移Django的psycopg 2用户不是表所有者的数据库表所导致的。
您需要检查Django迁移中涉及的表是否为
my_username
所有。要在psql
中执行此操作,您可以使用SELECT * FROM pg_tables ORDER BY tableowner;
。这使用了视图pg_tables
,它“提供了对数据库中每个表的有用信息的访问”。pg_tables
是Postgres的system catalogs的一部分,关系数据库管理系统存储模式元数据的位置。假设有问题的表由
other_username
(而不是my_username
)所有。要更新所有者,需要使用
--username=other_username
调用psql
,然后更改所有者:nqwrtyyt3#
如果您收到此错误,并正在使用Heroku主机平台,很可能是您正在尝试写入一个具有有限行数的爱好级数据库。
Heroku将允许您
pg:push
数据库,即使您超过了限制,但它将是只读的,因此任何内容的修改都不会被处理,并将抛出此错误。6mw9ycah4#
对于那些在使用PostgresQL时仍然有问题的人,我意识到我需要为我连接的每个数据库**更新模式public。我有一个dev和一个临时数据库,我试图在我的案例中使用同一个用户。
每个数据库都有自己的
public
模式。它只是数据库中的一个命名空间。如果您试图使用另一个数据库的用户,则需要连接到每个要授予权限的数据库,并在那里运行GRANT
命令。当您使用会话连接时,它连接到特定的数据库。而GRANT
命令仅适用于该特定数据库。RDS可能如下所示:
数据库会话..例如
将只应用于您连接到的DB名称(比如,db绿色箭头指向,而不是其他)。如果您想让用户使用Django处理
db_name
以外的事务,那么您需要连接到该数据库,并在那里授予public
模式的权限。mnowg1ta5#
与
public
相关的更改权限的答案在PostgreSQL 15中不再有效。如果您正在使用Django和PGSQL版本15,以下是正确的数据库设置过程。在Django的
myproject/settings.py
中,在DATABASES
部分需要一个额外的设置(OPTIONS
):如果遵循上述步骤,结果应正常且符合预期: