我一直在PostgreSQL中使用SQLITE数据库和Production进行开发.我刚刚用大量数据更新了本地数据库,需要将特定的表传输到生产数据库.

基于运行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兼容的转储文件,以便导入生产服务器?

推荐答案

您应该能够将该转储文件直接馈送到psql:

/path/to/psql -d database -U username -W < /the/path/to/sqlite-dumpfile.sql

如果希望id列"自动递增",那么在表创建行中将其类型从"int"更改为"Serial".然后,PostgreSQL会将一个序列附加到该列,以便ID为空的插入将自动分配下一个可用值.PostgreSQL也无法识别AUTOINCREMENT个命令,因此需要删除这些命令.

您还需要判断SQLite模式中的datetime列,并针对PostgreSQL将它们更改为timestamp.(感谢Clay指出这一点.)

如果SQLite中有布尔值,则可以将10分别转换为1::boolean0::boolean,或者可以在转储的模式部分将布尔列更改为整数,然后在导入后在PostgreSQL中手动修复它们.

如果您的SQLite中有BLOB,那么您需要将模式调整为使用bytea.你可能需要混入大约decode calls as well个.但是,如果您有很多BLOB要处理,用您最喜欢的语言编写一个又快又脏的复制器可能比 destruct SQL容易.

像往常一样,如果您有外键,那么您可能希望查看set constraints all deferred以避免插入顺序问题,将命令放在BEGIN/COMMIT对中.

感谢Nicolas Riley的布尔、blob和约束注释.

如果您的代码中有`个,就像某些SQLite3客户机生成的那样,那么您需要删除它们.

PostgreSQL也不能识别unsigned列,因此您可能希望删除该列或添加一个定制的约束,如下所示:

CREATE TABLE tablename (
    ...
    unsigned_column_name integer CHECK (unsigned_column_name > 0)
);

虽然SQLite将空值默认为'',但PostgreSQL要求将其设置为NULL.

SQLite转储文件中的语法似乎与PostgreSQL基本兼容,因此您可以修补一些内容并将其提供给psql.通过SQL插入导入一大堆数据可能需要一段时间,但它会奏效的.

Database相关问答推荐

prisma 中的隐式或显式多对多关系

授予对具有特定前缀的多个表的权限

Spring Framework 中的默认隔离级别

主必须包括表的分区位置错误中的所有列?

如何允许多个用户同时连接到我的 H2 数据库?

对百万行表,MySQL 的 LIKE 查询的性能怎样?

将实体框架中的字符串列映射到枚举

使用存储过程是一种不好的做法吗?

将所有数据库列设置为 NOT NULL 是一种好习惯吗?

SOA 和共享数据库

mySQL 复制是否具有即时数据一致性?

MySQL 数据库中列名中的连字符

如何在 SSIS 中插入新记录之前清空我的目标表?

如何一次插入1000行

PHP 可以与 MS SQL 数据库一起使用吗

如何以 SYS 身份在 Java 中连接到 Oracle?

如何修复 Postgres 上过时的 postmaster.pid 文件?

使用 oracle sql developer 从一个数据库复制到另一个数据库 - 连接失败

PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 类似功能是什么

如果值不为空,则用于更新数据库的 Sql 查询?