Ошибка в Kubernetes cronjob для дампа и восстановления базы данных postgres для приложения Django

Мне нужно создать среду тестирования для определенной команды, чтобы использовать наше приложение Django для тестирования на базе данных. Эта база данных должна быть в некоторой степени синхронизирована с нашей производственной базой данных. Учитывая, что у нас есть два кластера production и staging, мой подход заключается в следующем:

  • Создайте db_test на промежуточном сервере Postgres
  • .
  • db_test будет периодически синхронизироваться с db_prod. Для этого:
  • Создайте cronjob в кластере staging, который подключается к производственной базе данных, делает pg_dump, а затем делает pg_restore к db_test (используя localhost, поскольку он подключен через pgbouncer).
  • Запускаю миграции, чтобы убедиться, что таблицы актуальны
  • .
  • Далее: Мне нужно выполнить команду управления, которая сотрет некоторые данные клиентов из этой копии (чтобы соответствовать GDPR).

Желаемое поведение:

  • pg_dump и pg_restore успешно завершены, и новая база данных очищена от информации о клиентах
  • .

Актуальное поведение:

  • pg_dump и pg_restore прошли успешно. Я могу psql войти во вновь созданную базу данных и все выглядит нормально.
  • migrate команда терпит неудачу с трассировкой ниже
  • clean_db не работает, потому что не может найти некоторые таблицы (которые существуют, как я проверил с помощью psql.

Вот простой сценарий оболочки, который я запускаю в cronjob:

#!/bin/bash
# Dump the database locally
pg_dump --host=mydb.postgres.database.azure.com \
        --username=myuser@production \
        --no-owner \
        --verbose \
        -Ft db_prod > $HOME/db_prod-$(date +%F).tar &&

sleep 30 &&

# Restore the database
pg_restore --no-owner \
    --no-acl \
    --host='localhost' \
    --user=myuser@staging \
    --port=5432 \
    --clean \
    --dbname=db_test \
    $HOME/db_prod-$(date +%F).tar \
    --verbose &&

python manage.py migrate &&

python manage.py clean_db
  • Это ошибка clean_db без migrate перед
relation "uploader_somemodel" does not exist
2
LINE 1: SELECT COUNT(*) AS "__count" FROM "uploader_somemodel...

Но это журнал создания таблицы

pg_restore: processing data for table "public.uploader_somemodel"```
  • А это журнал ошибок команды migrate
Running all migrations...
Operations to perform:
  Apply all migrations: admin, auth, axes, contenttypes, django_mfa, myapp, reversion, sessions, uploader, userapi
Running migrations:
Traceback (most recent call last):
  File "/opt/venv/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 67, in ensure_schema
    editor.create_model(self.Migration)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 307, in create_model
    self.execute(sql, params or None)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 137, in execute
    cursor.execute(sql, params)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/opt/venv/lib/python3.8/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 82, in _execute
    return self.cursor.execute(sql)
django.db.utils.ProgrammingError: no schema has been selected to create in
LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
                     ^

Кто-нибудь сталкивался с подобной ошибкой и знает, в чем дело? Или, еще лучше, есть ли у вас предложение, как я могу выполнить это по-другому?

Вы изменили ИМЯ db в вашей переменной env? Чтобы получить этот результат в вашем django settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': db_test,
        'USER': POSTGRES_USER,
        'PASSWORD': POSTGRES_PASSWORD,
        'HOST': POSTGRES_HOST,
        'PORT': 5432,
    }
}
Вернуться на верх