Преобразование файла дампа SQL SQLite в 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 после импорта.

если у вас есть BLOBs в вашем SQLite, то вы захотите настроить схему для использования bytea. Вероятно, вам нужно будет смешать некоторые decode и. Написание quick'n'Dirty copier на вашем любимом языке может быть проще, чем искажение SQL, если вам нужно иметь дело с большим количеством капель.

как обычно, если у вас есть внешние ключи, то вы, вероятно, захотите заглянуть в set constraints all deferred чтобы избежать проблем с заказом вставки, поместите команду внутри BEGIN/COMMIT пара.

спасибо Николас Райли для примечаний boolean, blob и ограничений.

если у вас ` в вашем коде, сгенерированном некоторыми клиентами 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), я думаю, что добавление этого важно.

я начал искать решения здесь и понял, что я искал более автоматизированный метод. Я посмотрел wiki docs:

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, но он делает то, что мне нужно. Надеюсь, это станет хорошей отправной точкой для других.

https://gist.github.com/2253099


на продолжение 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 db:

pgloader базы данных SQLite.db postgresql://имя пользователя:пароль@хоста/dbname