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