Конвертировать 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, который я могу импортировать на свой рабочий сервер?

983   6  

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

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:

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

Comments

    Ничего не найдено.