Раньше мой код работал нормально с Postgres 12, теперь с Postgres 15 мой проект Django не может выполнять миграцию. Я нашел много ответов, предлагающих GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO <user>, но у меня это не работает, как показано ниже.
Это ошибка, которую я получаю:
lib/python3.11/site-packages/psycopg/cursor.py", line 732, in execute
raise ex.with_traceback(None)
psycopg.errors.InsufficientPrivilege: permission denied for schema public
LINE 1: CREATE TABLE "django_migrations" ("id" smallint NOT NULL PRI...
Ниже пользователь с именем django должен иметь возможность создавать таблицы в схеме public, чтобы он мог выполнять миграцию:
sudo -u postgres psql
could not change directory to "/home/john/project/src": Permission denied
psql (15.6 (Debian 15.6-0+deb12u1))
Type "help" for help.
postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO django;
GRANT
postgres=#
\q
(project) john@vps-demo:~/project/src$ psql -U django my_db
Password for user django:
psql (15.6 (Debian 15.6-0+deb12u1))
Type "help" for help.
my_db=> CREATE TABLE test_table1 (id INT);
ERROR: permission denied for schema public
LINE 1: CREATE TABLE test_table1 (id INT);
^
my_db=>
И проверка разрешений:
User
# sudo -u postgres psql -c "\dn+ public"
could not change directory to "/home/john/project/install": Permission denied
List of schemas
Name | Owner | Access privileges | Description
--------+-------------------+----------------------------------------+------------------------
public | pg_database_owner | pg_database_owner=UC/pg_database_owner+| standard public schema
| | =U/pg_database_owner +|
| | django=UC/pg_database_owner +|
| | john=UC/pg_database_owner |
(1 row)


Вы предоставляете django все разрешения для общедоступной схемы/пространства имен в базе данных «postgres», а не для базы данных/каталога «my_db».
В первой команде вы входите в базу данных/каталог postgres. Во втором вы пытаетесь создать таблицу в базе данных/каталоге «my_db».
Итак, если вы хотите предоставить «django» доступ к «my_db», вам необходимо:
\l в psql\c "my_db"Также в качестве примечания, если «django» должен быть единственным пользователем базы данных/каталога, он также может сделать его владельцем.
Пожалуйста, парень, получай удовольствие от написания сценариев :3
БОЛЬШОЕ СПАСИБО!! Я боролся с этим часами. Ты великое благословение, посланное Богом! Для всех, кто это записывает, вы можете сделать что-то вроде:
cmd_list = ['sudo', '-S', '-u', 'postgres', '-i', 'psql', '-d', db_name, '-c', command], то есть-d, чтобы указать имя БД при предоставлении всех привилегий.