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)