Можно ли запустить миграцию Django на облачной SQL-реплике, не являясь владельцем таблицы?
Я использую Google Cloud SQL для PostgreSQL в качестве внешней первичной реплики, при этом данные непрерывно реплицируются из автономного PostgreSQL источник с использованием Службы миграции баз данных (DMS) в режиме CDC.
Я подключил проект Django к этой реплике и попытался запустить миграцию, которая переименовывает столбец и добавляет новый:
uv run python manage.py migrate
Однако я получаю следующую ошибку:
django.db.utils.ProgrammingError: must be owner of table camera_manager_invoice
Это имеет смысл, поскольку в PostgreSQL ALTER TABLE
требуется владение таблицей. Но в данном случае реплика была создана DMS, поэтому фактическим владельцем таблицы является источник репликации, а не текущий пользователь.
🔍 Проблема:
Я пытаюсь применить изменения схемы с помощью миграции Django к облачной SQL-реплике, которой я не владею. Репликация данных (CDC) работает нормально, но мне нужно самостоятельно применить структурные изменения к реплике.
<время работы/>✅ Что я пробовал:
- Изменение подключенного пользователя: по-прежнему не является владельцем, та же ошибка.
- Запуск
sqlmigrate
для получения SQL и применение вручную: тот же результат — в разрешении отказано. - Попытка сменить владельца таблицы с помощью
ALTER TABLE ... OWNER TO ...
: ошибка из-за того, что вы не являетесь суперпользователем. - Пробовал запустить миграцию с помощью
--fake
, но это приводит к пропуску выполнения и не изменяет схему.
❓ Мой вопрос:
Есть ли какой-либо способ применить изменения схемы с помощью миграции Django (или вручную) к облачной SQL-реплике, не являясь владельцем таблицы?
Я готов выслушать альтернативы, лучшие практики или официальные рекомендации GCP для данной ситуации.
<время работы/>Нет. В PostgreSQL для ALTER TABLE
операций (таких как переименование столбцов или добавление новых) требуется, чтобы пользователь был владельцем таблицы. В вашем случае, поскольку облачная SQL-реплика заполняется через DMS, таблицы принадлежат исходной базе данных, а не пользователю, к которому вы подключаетесь в Django. А поскольку Cloud SQL не предоставляет привилегий суперпользователя, вы также не сможете сменить владельца.
Вам следует запустить миграцию Django (python manage.py migrate
) в исходной базе данных . Затем позвольте DMS продолжить репликацию изменений, включая новые столбцы или переименованные поля, в облачную SQL-реплику.