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)运行以下命令,其中mydatabase和dbuser应该是您自己的数据库和用户名:
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)
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)
对于在使用 PostgresQL 时仍然遇到问题的人们,我意识到我需要更新我连接到的每个数据库的公共架构。我有一个开发人员和一个临时数据库,我试图在我的案例中使用相同的用户。
每个数据库都有自己的public模式。它只是数据库中的一个名称空间。如果您尝试将该用户用于另一个数据库,则需要连接到要授予权限的每个数据库,并GRANT在那里运行命令。当您连接会话时,它会连接到特定数据库,并且GRANT命令仅适用于该特定数据库。
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)
更改与 相关的权限的答案对于 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)
对于 postresql 15 和 Django
sudo -u postgres psql database_name
GRANT CREATE ON SCHEMA public TO your_dbuser;
Run Code Online (Sandbox Code Playgroud)
如果您收到此错误并且正在使用 Heroku 托管平台,那么您很可能正在尝试写入行数有限的业余爱好级数据库。
即使超出限制, Heroku 也将允许您访问pg:push数据库,但它将是只读的,因此对内容的任何修改都不会被处理,并将引发此错误。
| 归档时间: |
|
| 查看次数: |
14330 次 |
| 最近记录: |