我一直在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兼容的转储文件,以便导入到生产服务器中?
发布于 2011-01-03 11:38:10
您应该能够将该转储文件直接提供给psql
/path/to/psql -d database -U username -W < /the/path/to/sqlite-dumpfile.sql如果希望id列“自动递增”,则在表创建行中将其类型从"int“更改为"serial”。然后,PostgreSQL会将一个序列附加到该列,以便ids为空的插入将自动分配到下一个可用值。PostgreSQL也无法识别AUTOINCREMENT命令,因此需要删除这些命令。
您还需要检查SQLite模式中的datetime列,并将它们更改为timestamp for PostgreSQL。(感谢Clay指出这一点。)
如果SQLite中有布尔值,那么可以将1和0分别转换为1::boolean和0::boolean,或者可以在转储的模式部分中将布尔列更改为整数,然后在导入后在PostgreSQL中手动修复它们。
如果您的SQLite中有bytea,那么您需要调整模式以使用BLOB。您可能需要混入一些decode calls as well。但是,如果您有很多BLOB要处理,用您最喜欢的语言编写一个又快又脏的复制器可能比破坏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插入导入一大堆数据可能需要一段时间,但这是可行的。
发布于 2015-05-30 17:30:30
我在寻找一种将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状态。然后,我使用createdb创建了一个testdb
createdb testdb
我像这样运行pgloader命令:
pgloader command
然后连接到新数据库:
psql testdb
经过一些查询检查数据后,它似乎工作得很好。我知道,如果我试图运行这些脚本中的一个,或者执行这里提到的逐步转换,我会花费更多的时间。
为了证明这个概念,我转储了这个testdb,并将其导入到生产服务器上的开发环境中,数据传输得很好。
发布于 2015-07-21 00:16:57
Ruby (一个sequel gem库)提供了跨不同数据库的数据复制:http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Databases
首先安装Ruby,然后运行gem install sequel安装gem。
对于sqlite,它将如下所示:sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db
https://stackoverflow.com/questions/4581727
复制相似问题