将sqlite数据库加载到Postgres中

5

我已经在本地开发了一段时间,现在要将所有内容推送到生产环境。当然,我也在开发服务器上添加了数据,但没有考虑重新配置为Postgres。

现在我有一个SQLite数据库,其中的信息需要传输到远程VPS上的Postgres数据库中。

我尝试将其转储为.sql文件,但是Postgres报告了很多语法错误。有什么最好的方法可以解决这个问题呢?


可以使用中间格式,例如CSV吗?如果Pg模式匹配,则“仅插入”在.sql转储中应该是可以的。请验证.sql转储中是否有DDL / DML。此外,请考虑发布生成Pg语法错误部分的*转储,并附带确切的错误消息。 - user166390
DDL/DML?它在抱怨AUTOINCREMENT。 - Chris
还有一些 PRAGMA,我认为可以安全删除。 - Chris
DDL = 数据定义语言 = CREATE TABLE。(忘记我在那个上下文中说的关于 DML 的话吧。)只需确保 Pg 具有相同的模式--Pg 将使用一个序列来进行“自增”列--然后确保导入仅包含 DML(例如 INSERT)。 - user166390
https://github.com/dimitri/pgloader - Tomasz Gandor
3个回答

4

对于两个数据库之间的任何转换,选项如下:

  1. 从源数据库中进行仅架构的转储。手动转换并将其加载到目标数据库中。然后以源DB提供的最兼容的SQL转储形式进行数据转储。尝试将其加载到目标DB中。遇到问题时,使用sed/awk/perl或其他脚本转换转储,并重复尝试,直到加载并且结果匹配。

  2. 与(1)类似,手动转换架构。然后用您喜欢的语言编写一个脚本,连接到两个数据库,从其中一个SELECT,并插入到另一个中,可能需要对数据类型和表示进行一些转换。

  3. 使用ETL工具(例如Talend或Pentaho)连接到两个数据库并在它们之间进行转换。 ETL工具就像是(2)的“别人已经编写好了”版本,但可能需要一些学习成本。

  4. 希望您可以找到预先编写的转换工具。Heroku有一个称为 sequel 的工具可用于SQLite-> PostgreSQL;是否可以在没有Heroku和所有其他Heroku基础架构和代码的情况下使用?

在进行以上任何操作后,通常需要进行一些后转移步骤,例如使用 setval()初始化序列。


2

Heroku 的数据库转换工具称为 sequel。以下是你需要的 Ruby 宝石:

gem install sequel
gem install sqlite3
gem install pg

对于当前工作目录中命名为“tweets.db”的sqlite数据库文件,以下方法适用于我:

sequel -C sqlite://tweets.db postgres://pgusername:pgpassword@localhost/pgdatabasename

1
谢谢!给那些通过谷歌搜索此问题的人一个提示:我不得不安装 gem sqlite3 而不是 sqlite。否则你会得到以下错误信息:Error: Sequel::AdapterNotFound: LoadError: cannot load such file -- sqlite3 <internal:/usr/local/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in 'require' - hraban
谢谢 @hraban,我已经更新了 gem 安装。 - hobs

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接