加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

database – 将SQLITE SQL转储文件转换为POSTGRESQL

发布时间:2020-12-12 19:20:39 所属栏目:百科 来源:网络整理
导读:我一直在做开发使用SQLITE数据库与POSTGRESQL生产。我只是用大量的数据更新我的本地数据库,并需要将特定的表传输到生产数据库。 基于运行sqlite数据库.dump /the/path/to/sqlite-dumpfile.sql,SQLITE以以下格式输出表转储: BEGIN TRANSACTION;CREATE TABL
我一直在做开发使用SQLITE数据库与POSTGRESQL生产。我只是用大量的数据更新我的本地数据库,并需要将特定的表传输到生产数据库。

基于运行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;

如何将上述转换为POSTGRESQL兼容的转储文件,我可以导入到我的生产服务器?

您应该能够将该转储文件直接馈入psql:
/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导入大量数据可能需要一段时间,但它会工作。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读