首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将SQLITE SQL转储文件转换为POSTGRESQL

将SQLITE SQL转储文件转换为POSTGRESQL
EN

Stack Overflow用户
提问于 2011-01-03 10:33:27
回答 7查看 93.5K关注 0票数 115

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

基于运行sqlite database .dump > /the/path/to/sqlite-dumpfile.sql,SQLITE以以下格式输出表转储:

代码语言:javascript
复制
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兼容的转储文件,以便导入到生产服务器中?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-01-03 11:38:10

您应该能够将该转储文件直接提供给psql

代码语言:javascript
复制
/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中有布尔值,那么可以将10分别转换为1::boolean0::boolean,或者可以在转储的模式部分中将布尔列更改为整数,然后在导入后在PostgreSQL中手动修复它们。

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

通常,如果您有外键,那么您可能需要检查set constraints all deferred以避免插入顺序问题,将命令放在BEGIN/COMMIT对中。

感谢Nicolas Riley提供的布尔值、blob和约束注释。

如果您的代码中包含由某些SQLite3客户端生成的`,则需要删除它们。

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

代码语言:javascript
复制
CREATE TABLE tablename (
    ...
    unsigned_column_name integer CHECK (unsigned_column_name > 0)
);

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

SQLite转储文件中的语法似乎在很大程度上与PostgreSQL兼容,因此您可以修补一些内容并将其提供给psql。通过SQL插入导入一大堆数据可能需要一段时间,但这是可行的。

票数 115
EN

Stack Overflow用户

发布于 2015-05-30 17:30:30

pgloader

我在寻找一种将SQLite转储转换为PostgreSQL的方法时偶然发现了这篇文章。尽管这篇文章有一个公认的答案(在+1上有一个很好的答案),但我认为添加这个很重要。

我开始研究这里的解决方案,并意识到我正在寻找一种更自动化的方法。我查了维基文档:

https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL

并发现了pgloader。相当酷的应用程序,并且相对容易使用。您可以将平面SQLite文件转换为可用的PostgreSQL数据库。我从*.deb安装,并在测试目录中创建了一个command文件,如下所示:

代码语言:javascript
复制
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,并将其导入到生产服务器上的开发环境中,数据传输得很好。

票数 78
EN

Stack Overflow用户

发布于 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

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4581727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档