Мне нужно перенести сложный проект с sqlite на PostgreSQL. Много у людей, кажется, есть проблемы с внешними ключами, усечением данных и так далее ...
Редактировать : Я пробовал django-command-extensions DumpScript , но он не запускается на моем ПК с ОЗУ 2 ГБ с моим текущим набором данных.
Для начала я бы попробовал просто:
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, по крайней мере, во время импорта.
Мне никогда не приходилось этого делать, но я бы попробовал.
Другой способ сделать это - использовать несколько баз данных.
http://docs.djangoproject.com/en/dev/topics/db/multi-db/
Важно, чтобы вы прочитали этот раздел.
Насколько я понимаю, это означает при условии, что в вашей новой БД нет данных, например, из приборов, вы можете сделать
queryset = MyModel.objects.using("old-db").all()
for obj in queryset:
obj.save(using="new-db")
Поскольку это должно сохранить первичные ключи, я не думаю, что возникнут какие-либо проблемы с внешним ключом.