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

use*_*149 32 python apache django postgresql github

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

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

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

use*_*149 82

我能够根据这个问题的说明解决我的问题.基本上,需要将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;"
Run Code Online (Sandbox Code Playgroud)

  • 当我使用一个用户创建数据库然后更改数据库的所有者时,我遇到了这个问题。这些表保留了导致此错误的旧所有者。做修复我删除了数据库,使用 posgres 用户重新创建它,将所有权限授予新用户并运行迁移。 (2认同)
  • 该答案对于 PostgreSQL 15 无效。15 及以上版本的新正确答案如下:/sf/answers/5208706401/ (2认同)

Bra*_*mon 14

正如@user3062149 所提到的,这可能是由于尝试迁移 Django 的 psycopg2 用户不是表所有者的数据库表引起的。例如,如果您在项目的settings.py

DATABASES = {
    'default': {
        'USER': 'my_username',
        # ...
Run Code Online (Sandbox Code Playgroud)

您需要检查 Django 迁移中涉及的表是否归my_username. 为此psql,您可以使用SELECT * FROM pg_tables ORDER BY tableowner;. 这使用视图pg_tables,它“提供对数据库中每个表的有用信息的访问”。 pg_tables是 Postgres系统目录的一部分,是关系数据库管理系统存储模式元数据的地方。

假设有问题的表归other_username(not my_username) 所有。

要更新所有者,那么你需要调用psql--username=other_username,然后更改所有者:

ALTER TABLE public.<table_name> OWNER TO my_username;
Run Code Online (Sandbox Code Playgroud)


Nic*_*ady 6

对于在使用 PostgresQL 时仍然遇到问题的人们,我意识到我需要更新我连接到的每个数据库的公共架构。我有一个开发人员和一个临时数据库,我试图在我的案例中使用相同的用户。

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

RDS 可能如下所示: 在此输入图像描述 数据库会话..说

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;
Run Code Online (Sandbox Code Playgroud)

仅适用于您连接到的数据库名称(例如,绿色箭头指向数据库,而不是其他)。如果您想让用户使用 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;
Run Code Online (Sandbox Code Playgroud)


Utk*_*nos 6

更改与 相关的权限的答案对于 PostgreSQL 15 不再public有效。如果您将 Django 与 PGSQL 版本 15 一起使用,则以下是现在正确的数据库设置过程。

su - postgres
psql -c "CREATE DATABASE mydatabase"
psql -c "CREATE USER myuser WITH PASSWORD 'somepassword'"
psql -d mydatabase -c "CREATE SCHEMA myschema AUTHORIZATION myuser"
psql -c "ALTER ROLE myuser SET client_encoding TO 'utf8'"
psql -c "ALTER ROLE myuser SET default_transaction_isolation TO 'read committed'"
psql -c "ALTER ROLE myuser SET timezone TO 'UTC'"
Run Code Online (Sandbox Code Playgroud)

在 Django 方面,该部分需要myproject/settings.py一个附加设置 ( OPTIONS) DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'OPTIONS': {
                'options': '-c search_path=myschema'
            },
        'NAME': 'mydatabase',
        'USER': 'myuser',
        'PASSWORD': 'somepassword',
        'HOST': 'localhost'
    }
}
Run Code Online (Sandbox Code Playgroud)

如果遵循上述步骤,结果应该看起来正常且符合预期:

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
Run Code Online (Sandbox Code Playgroud)


war*_*esh 6

对于 postresql 15 和 Django

sudo -u postgres psql database_name
GRANT CREATE ON SCHEMA public TO your_dbuser;
Run Code Online (Sandbox Code Playgroud)


Pet*_*ott 5

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

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