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

Posted

技术标签:

【中文标题】解决“django.db.utils.ProgrammingError: 关系 django_migrations 的权限被拒绝”的步骤【英文标题】:Steps to Troubleshoot "django.db.utils.ProgrammingError: permission denied for relation django_migrations" 【发布时间】:2016-12-21 00:53:38 【问题描述】:

有哪些基本步骤可以排除 Django 的“django.db.utils.ProgrammingError: permission denied for relationship django_migrations”错误的原因?

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

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

【问题讨论】:

您的 settings.py 文件中的数据库设置是否正确?该用户是否存在于 Postgres 中?密码正确吗? @ResleyRodrigues 我在用户 ubuntu 下运行 manage.py,但我的虚拟环境将我的 DATABASE_USER 环境变量设置为 dbuser,这也用于我的生产设置文件中的 DATABASES 定义对于姜戈。在 Postgres 中,dbuser 存在并且我相信已被授予正确的权限。 dbuser 具有属性 Create DB 作为 postgres 用户,并具有 CTc 的 db 的访问权限。 this help? 是的,我查看了上一个问题/答案,我之前的评论包含了我发现的内容。从本质上讲,我没有看到任何表明我为 dbuser 设置错误的 postgres 权限。 【参考方案1】:

我能够根据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;"

【讨论】:

哇,非常感谢!一直在到处寻找解决方案。当我已经有一个迁移的数据库然后我尝试设置 geodjango 时遇到了这个问题。 当我用一个用户创建一个数据库然后更改数据库的所有者时,我遇到了这个问题。这些表保留了导致此错误的旧所有者。修复我删除了数据库,使用 posgres 用户重新创建它,将所有权限授予新用户并运行迁移。 我不知道怎么做,重新创建整个数据库比较容易 =) 关注有关在 Linux 上安装 Saleor 的 Saleor 官方文档的人可能需要这个答案。我做到了。 @user3062149,您能否说明一个明显的事实,即需要以所有者身份登录数据库才能对其他用户具有很大权限?对于像我这样的未来新手。【参考方案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)所有。

要更新所有者,您需要使用--username=other_username 调用psql,然后更改所有者:

ALTER TABLE public.<table_name> OWNER TO my_username;

【讨论】:

【参考方案3】:

如果您收到此错误并且正在使用 Heroku 托管平台,则很可能您正在尝试写入具有有限行数的爱好级数据库。

即使您超出限制,Heroku 也允许您 pg:push 数据库,但它将是只读的,因此对内容的任何修改都不会被处理并会引发此错误。

【讨论】:

【参考方案4】:

对于在使用 PostgresQL 时仍有问题的人,我意识到我需要为我连接到的每个数据库更新公共架构 。我有一个开发数据库和一个暂存数据库,我试图在我的情况下使用同一个用户。

每个数据库都有自己的public 架构。它只是数据库中的一个命名空间。如果您尝试将该用户用于另一个数据库,那么您需要连接到您想要授予权限的每个数据库,并在那里运行您的GRANT 命令。当您连接会话时,它会连接到特定数据库,而GRANT 命令仅适用于该特定数据库。

RDS 可能如下所示: DB会话..说

psql -U postgres -h some.host.com -p 5432 --password db_name
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

仅适用于您连接的数据库名称(例如,db 绿色箭头指向,而不是另一个)。如果您想让用户使用 Django 处理 db_name 以外的其他内容,那么您需要连接到该数据库并在那里授予 public 架构的权限。

\c other_db

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

【讨论】:

我应该在哪里传递这行代码 @DrayenDörff 关键是您连接到要修改的数据库。如果您在单个 postgresql 服务器上有多个数据库,您不能只运行它并假设它会影响您的所有数据库而不做一些更花哨的事情,例如角色。例如。 /c db_name 然后运行命令。

以上是关于解决“django.db.utils.ProgrammingError: 关系 django_migrations 的权限被拒绝”的步骤的主要内容,如果未能解决你的问题,请参考以下文章

vs2008解决方案资源管理器不显示解决方案

什么是 沙盒解决方案

解决PowerShell乱码问题

如何解决解决方案中现有项目的c#CS0006错误

关于问题解决与事件解决的思考

「解决方案架构」解决方案架构概述