apache 步骤来解决“django.db.utils.编程错误:关系django_migrations的权限被拒绝”

kr98yfug  于 2022-11-16  发布在  Apache
关注(0)|答案(5)|浏览(170)

对于“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 ...命令时,我收到消息,表明系统正常。

az31mfrm

az31mfrm1#

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

jdg4fx2g2#

正如@user3062149所提到的,这可能是由于试图迁移Django的psycopg 2用户不是表所有者的数据库表所导致的。

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;
nqwrtyyt

nqwrtyyt3#

如果您收到此错误,并正在使用Heroku主机平台,很可能是您正在尝试写入一个具有有限行数的爱好级数据库。
Heroku将允许您pg:push数据库,即使您超过了限制,但它将是只读的,因此任何内容的修改都不会被处理,并将抛出此错误。

6mw9ycah

6mw9ycah4#

对于那些在使用PostgresQL时仍然有问题的人,我意识到我需要为我连接的每个数据库**更新模式public。我有一个dev和一个临时数据库,我试图在我的案例中使用同一个用户。
每个数据库都有自己的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;

将只应用于您连接到的DB名称(比如,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;
mnowg1ta

mnowg1ta5#

public相关的更改权限的答案在PostgreSQL 15中不再有效。如果您正在使用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'"

在Django的myproject/settings.py中,在DATABASES部分需要一个额外的设置(OPTIONS):

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

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

$ 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

相关问题