Django: Как лучше всего перенести проект из sqlite в PostgreSQL

Мне нужно перенести сложный проект с sqlite на PostgreSQL. Много у людей, кажется, есть проблемы с внешними ключами, усечением данных и так далее ...

  • Есть ли полностью автоматизированная утилита?
  • Нужно ли мне проверять некоторые данные или схему перед миграцией?

Редактировать : Я пробовал django-command-extensions DumpScript , но он не запускается на моем ПК с ОЗУ 2 ГБ с моим текущим набором данных.

26
задан Cœur 27 April 2018 в 01:43
поделиться

3 ответа

Для начала я бы попробовал просто:

sqlite3 sqllitedb .dump | psql postgresdb

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

Если это не сработает...

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

Вместо этого я бы создал вторую версию вашего приложения с правильными настройками базы данных PostgreSQL, запустил syncdb для создания всех таблиц, а затем скопировал данные из mysqllite в PostgreSQL с помощью какого-нибудь другого инструмента.

Дело в том, что большинство проблем при конвертации данных возникает в определениях таблиц и т.д. Они кажутся наиболее идиотичными. Они кажутся наиболее идиосинкразическими. Если вы можете создать SQL-скрипт, который представляет собой дамп только содержимого таблицы, то это должны быть вполне стандартные команды SQL INSERT INTO.

Честно говоря, я не могу понять, почему могут возникнуть проблемы с внешними ключами. Если предположить, что sqlite создает точные внешние ключи (а почему бы и нет?), то не может быть, чтобы они не копировались правильно. Действительно, внешние ключи не являются особыми формами данных. Не более вероятно, что поле UserProfile.user_id будет содержать неверное значение, чем поле UserProfile.photo. Если проблема внешнего ключа заключается в том, что сами поля неправильно определены как поля внешнего ключа (т.е. нет ограничений), то вариант создания базы данных с помощью syncdb решит эту проблему.

Что касается усечения: насколько я понимаю, PostgreSQL выдает ошибку, если данные собираются быть усеченными. Я не знаю, так ли это в случае с sqlite или он просто усекает данные без звука. В любом случае, если sqlite каким-то образом не изменяет данные при экспорте, поля должны содержать данные нужной длины для поля, в которое они попадают. Единственное, на что я могу повлиять, это кодировка символов, поэтому убедитесь, что поля PostgreSQL имеют ту же кодировку, что и таблицы sqlite, по крайней мере, во время импорта.

2
ответ дан 28 November 2019 в 06:26
поделиться

Мне никогда не приходилось этого делать, но я бы попробовал.

  1. Прекращение работы серверов
  2. python manage.py dumpdata
  3. Измените settings.py, чтобы он указывал на вновь созданную базу данных postgres
  4. python manage.py loaddata
9
ответ дан 28 November 2019 в 06:26
поделиться

Другой способ сделать это - использовать несколько баз данных.

http://docs.djangoproject.com/en/dev/topics/db/multi-db/

Важно, чтобы вы прочитали этот раздел.

http://docs.djangoproject.com/en/dev/topics/db/multi-db/#moving-an-object-from-one-database-to-another

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

queryset = MyModel.objects.using("old-db").all()
for obj in queryset:
    obj.save(using="new-db")

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

4
ответ дан 28 November 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: