Django - синхронизация данных между несколькими базами данных

В среде с несколькими базами данных, как переместить все данные из базы данных в другую?

Настройки выглядят так:

DATABASES = {
    'default': {},
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.sqlite3',
        'USER': 'user',
        'PASSWORD': 'superS3cret'
    },
    'customers': {
        'NAME': 'customer_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'cust',
        'PASSWORD': 'veryPriv@ate'
    }
}

Есть ли простое решение / приложение для этого? Хотя односторонней миграции достаточно, поскольку существуют десятки Моделей и объектов со сложными соединениями с внешним ключом и многими-многими, итерирование по Моделям и объектам и сохранение их в другом не решает мою проблему.

loaddata тоже терпит неудачу, потому что создание объекта использует сигналы для создания других объектов, и это портит уникальные ключи.

Использование дампов sql даже нетривиально, поскольку бэкэнды разные. Я пробовал это, я не мог сделать psql-дампы из моей базы данных sqlite3, которые не портят внешние ключи.

Поэтому мне нужно решение, которое загружает данные из базы данных в другую, но не отправляет сигналы, а также работает с внешними ключами. Но я не мог найти ничего, что делает это.

2 ответа

Решение

Наконец мне удалось решить это.

Я создал таблицы, используя

manage.py syncdb --all
manage.py migrate --fake

Загрузка дампов с loaddata не работал из-за проблем целостности. (Сломанные ограничения внешнего ключа, например)

Поэтому мне пришлось изменить свои таблицы. Я снял нарушенные ограничения, и тогда я мог бежать loaddata без проблем.

Однако, конечно, моя база данных все еще была повреждена, так как я снял пару ограничений. Поэтому мне просто пришлось снова изменить свои таблицы, используя psql ракушка.

pgAdmin пригодился, поскольку отображает соответствующие запросы дампа на дружественном интерфейсе, отдельно для каждого отдельного ограничения.

Я бы просто написал скрипт на Python для переноса экземпляра из одной базы данных в другую. Запустите этот скрипт, используя скрипт запуска django-extensions

например

# Move Foo table data from one to another
for each_foo in Foo.objects.using("users").all():
  # _create foo instance in customer_data
  foo_obj, status = Foo.objects.using("customers").get_or_create(
                                            foo_name=each_foo.foo_name, 
                                            foo_code=each_foo.foo_code)
Другие вопросы по тегам