Конвертировать SQLite файл дампа SQL в POSTGRESQL
Я занимался разработкой с использованием базы данных SQLITE с производством в POSTGRESQL. Я просто обновил свою локальную базу данных с огромным количеством данных и должен передать определенную таблицу в производственную базу данных.
на основе работающей sqlite database .dump > /the/path/to/sqlite-dumpfile.sql, SQLITE выводит дамп таблицы в следующем формате:
BEGIN TRANSACTION;
CREATE TABLE "courses_school" ("id" integer PRIMARY KEY, "department_count" integer NOT NULL DEFAULT 0, "the_id" integer UNIQUE, "school_name" varchar(150), "slug" varchar(50));
INSERT INTO "courses_school" VALUES(1,168,213,'TEST Name A',NULL);
INSERT INTO "courses_school" VALUES(2,0,656,'TEST Name B',NULL);
....
COMMIT;
Как преобразовать вышеизложенное в файл дампа, совместимый с POSTGRESQL, который я могу импортировать на свой рабочий сервер?
6 ответов:
вы должны быть в состоянии кормить этот файл дампа прямо в
psql:/path/to/psql -d database -U username -W < /the/path/to/sqlite-dumpfile.sqlесли вы хотите
idстолбец " auto increment "затем измените его тип с" int "на" serial " в строке создания таблицы. Затем PostgreSQL присоединит последовательность к этому столбцу, чтобы вставки с нулевыми идентификаторами автоматически присваивали следующее доступное значение. Она также не признаетAUTOINCREMENTкоманды, так что они должны быть удалены.вы также хотите, чтобы проверить ибо
datetimeстолбцы в схеме SQLite и измените их наtimestampдля PostgreSQL (спасибо глина для указания на это).если у вас есть логические значения в вашем SQLite, то вы можете конвертировать
1и0и1::booleanи0::boolean(соответственно) или вы можете изменить логический столбец на целое число в разделе схемы дампа, а затем исправить их вручную внутри PostgreSQL после импорта.если у вас есть капли в вашем SQLite, то вы хотите настроить схему для использования
bytea. Вам, вероятно, нужно будет смешать в некоторыхdecodeи. Написание quick'n'Dirty copier на вашем любимом языке может быть проще, чем калечить SQL, если у вас много капель, с которыми нужно иметь дело.как обычно, если у вас есть внешние ключи, то вы, вероятно, захотите заглянуть в
set constraints all deferredчтобы избежать проблем с порядком вставки, поместите команду внутри BEGIN / COMMIT пара.спасибо Николас Райли для примечаний булевых, больших двоичных объектов и ограничений.
если у вас
`в вашем коде, созданном некоторыми клиентами SQLite3, вам нужно их удалить.PostGRESQL также не распознает
unsignedстолбцы, вы можете удалить это или добавить пользовательское ограничение, например:CREATE TABLE tablename ( ... unsigned_column_name integer CHECK (unsigned_column_name > 0) );в то время как SQLite по умолчанию null значения
'', PostgreSQL требует, чтобы они были установлены какNULL.синтаксис в файле дампа SQLite, по-видимому, в основном совместим с PostgreSQL, поэтому вы можете исправить несколько вещей и передать его
psql. Импорт большой кучи данных через SQL вставки может занять некоторое время, но это будет работать.
pgloaderя наткнулся на этот пост при поиске способа преобразования дампа SQLite в PostgreSQL. Несмотря на то, что этот пост имеет принятый ответ (и хороший в этом +1), я думаю, что добавление этого важно.
я начал искать решения здесь и понял, что я искал более автоматизированный метод. Я посмотрел Вики документы:
https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL
и обнаружен
pgloader. Довольно крутое приложение, и оно относительно простое в использовании. Вы можете преобразовать плоский файл SQLite в полезную базу данных PostgreSQL. Я установил из*.debи создалcommandтакой файл в тестовом каталоге:load database from 'db.sqlite3' into postgresql:///testdb with include drop, create tables, create indexes, reset sequences set work_mem to '16MB', maintenance_work_mem to '512 MB';как docs государство. Затем я создал
testdbСcreatedb:
createdb testdbя побежал такой:
pgloader commandа затем подключается к новой базе данных:
psql testdbпосле некоторых запросов для проверки данных, оказалось весьма неплохо. Я знаю, что если бы я попытался запустить один из этих сценариев или выполнить пошаговое преобразование, упомянутое здесь, я бы потратил гораздо больше времени.
чтобы доказать концепцию я бросил это
testdbи импортируется в среду разработки на рабочем сервере, и данные передаются красиво.
Я написал сценарий, чтобы сделать
sqlite3доpostgresмиграция. Он не обрабатывает все переводы схемы / данных, упомянутые в https://stackoverflow.com/a/4581921/1303625, но он делает то, что мне нужно было сделать. Надеюсь, это будет хорошей отправной точкой для других.
на продолжение gem (библиотека Ruby) предлагает копирование данных из разных баз данных: http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Databases
в случае sqlite, это было бы так:
sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db
вы можете использовать один вкладыш, вот пример с помощью команды sed:
sqlite3 mjsqlite.db .dump | sed -e 's/INTEGER PRIMARY KEY AUTOINCREMENT/SERIAL PRIMARY KEY/' | sed -e 's/PRAGMA foreign_keys=OFF;//' | sed -e 's/unsigned big int/BIGINT/g' | sed -e 's/UNSIGNED BIG INT/BIGINT/g' | sed -e 's/BIG INT/BIGINT/g' | sed -e 's/UNSIGNED INT(10)/BIGINT/' | sed -e 's/BOOLEAN/SMALLINT/g' | sed -e 's/boolean/SMALLINT/g' | sed -e 's/UNSIGNED BIG INT/INTEGER/g' | sed -e 's/INT(3)/INT2/g' | sed -e 's/DATETIME/TIMESTAMP/g' | psql mypqdb mypguser
pgloader творит чудеса по преобразованию базы данных в sqlite в postgresql.
вот пример преобразования локального sqlitedb в удаленную базу данных PostgreSQL:
pgloader sqlite.db postgresql://имя пользователя:пароль@хоста/имя_бд
Comments