基于运行sqlite数据库.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,656,'TEST Name B',NULL); .... COMMIT;
/path/to/psql -d database -U username -W < /the/path/to/sqlite-dumpfile.sql
如果希望id列为“自动递增”,则在表创建行中将其类型从“int”更改为“serial”。 Postgresql然后将一个序列附加到该列,以便具有NULL ID的INSERT将被自动分配下一个可用的值。 Postgresql也不会识别AUTOINCREMENT命令,所以这些需要删除。
您还需要检查sqlite模式中的datetime列,并将它们更改为Postgresql的时间戳(感谢Clay指出这一点)。
如果你的sqlite中有布尔值,那么你可以转换1和0和1 :: boolean和0 :: boolean(分别)或者你可以在转储的模式部分中将布尔值更改为一个整数,然后将它们修复手里面Postgresql后导入。
如果你的sqlite中有BLOB,那么你需要调整模式以使用bytea。你可能需要在一些decode
calls as well混合。用你最喜欢的语言编写一个快速的不脏的复印机可能比修整sql更容易,如果你有很多BLOB要处理。
像往常一样,如果你有外键,那么你可能想调查set constraints all deferred
以避免插入顺序问题,将命令放在BEGIN / COMMIT对中。
感谢Nicolas Riley的布尔,blob和约束注释。
如果你的代码,由一些sqlite3客户端生成,你需要删除它们。
PostGREsql也不能识别未签名的列,您可能想要删除它,或添加一个自定义的约束,如:
CREATE TABLE tablename ( ... unsigned_column_name integer CHECK (unsigned_column_name > 0) );
虽然sqlite默认为null值为“,Postgresql要求将它们设置为NULL。
sqlite转储文件中的语法似乎与Postgresql大部分兼容,所以你可以补丁几个东西,并将其提供给psql。通过sql INSERT导入大量数据可能需要一段时间,但它会工作。