【发布时间】:2015-05-25 21:12:18
【问题描述】:
我有一个 ruby on rails 应用程序托管在 heroku 上,使用 postgresql 作为其数据库。由于数据库变得非常大,我想知道是否有一种方法可以只从 heroku 下载其中的特定部分。例如,是否可以只下载一个特定的表,或者只下载 parent_id == x 的行。
【问题讨论】:
标签: ruby-on-rails database postgresql heroku partial
我有一个 ruby on rails 应用程序托管在 heroku 上,使用 postgresql 作为其数据库。由于数据库变得非常大,我想知道是否有一种方法可以只从 heroku 下载其中的特定部分。例如,是否可以只下载一个特定的表,或者只下载 parent_id == x 的行。
【问题讨论】:
标签: ruby-on-rails database postgresql heroku partial
除了史蒂夫非常正确的答案之外,您还可以选择使用psql 连接到DATABASE_URL 并使用\copy,例如
$ psql "$(heroku config:get DATABASE_URL)"
mydb=> \copy mytable TO 'mytable.csv' WITH (FORMAT CSV, HEADER)
mydb=> \copy (SELECT col1, col2 FROM mytable2 WHERE ...) TO 'mytable2_partial.csv' WITH (FORMAT CSV, HEADER)
您可以提取整个表,或任意查询的输出(包括连接等)。表定义 (DDL) 不会以这种方式导出,但可以使用 pg_dump --schema-only -t ... 转储。
【讨论】:
psql,任何脚本语言都可以。或者您可以使用 Ruby pg gem 的 copy 支持到 COPY ... TO STDOUT 而不是使用 psql 和 \copy;有关于如何直接从 Ruby 中的Pg gem 中COPY 的现有答案。
使用DATABASE_URL 配置设置,您可以使用pg_dump 访问您的数据库并使用-t 开关指定某个表。
例如,要将表 my_table 导出到名为 db.sql 的文件中:
pg_dump -t my_table `heroku config:get DATABASE_URL` > db.sql
如果您需要将下载限制在某些行,那么我认为pg_dump 不会自己完成这项工作。您可以在 Heroku 数据库中创建另一个表,以首先定义要下载的行子集,然后让 pg_dump 仅转储该表。有关如何执行此操作的一些想法,请参阅此问题:Export specific rows from a PostgreSQL table as INSERT SQL script
【讨论】: