【问题标题】:Postgres: Combining multiple COPY TO outputs to a postgres-importable filePostgres:将多个 COPY TO 输出组合到 postgres 可导入文件
【发布时间】:2015-05-27 06:02:33
【问题描述】:

我的数据库托管在 heroku 上,我想下载数据库的特定部分(例如,来自table 1 的所有 id > x 的行,来自table 2 的所有名称 = x 的行等)在一个文件中。

从一些研究和提问here 看来,某种修改后的 pg_dump 可以解决我的问题。但是,我将无法使用 pg_dump,因为我无法访问命令行(基本上我希望能够在我的网络应用程序中单击一个按钮,它会生成 + 下载数据库文件)。

所以我的新策略是使用 postgres copy 命令。我将浏览我的服务器数据库中的各种表,运行 COPY (Select * FROM ... WHERE ...) TO filename ,其中 filename 只是一个临时文件,我将在完成后下载。

问题是这个filename 文件只有行,所以我不能转身将它导入pgadmin。假设我设置了一个“空”数据库(架构、索引和东西都已经设置好了),有没有办法可以格式化我的 filename 文件,以便可以轻松地将其导入 postgres 数据库?

【问题讨论】:

  • 我认为您需要使用您的应用程序创建一个空的数据库架构,因为听起来您正在使用架构生成。然后逐行导入。
  • 您可以通过运行 COPY TABLENAME from 'filename' 从该“文件名”“导入”数据...在“导出”时请记住,如果您使用一个“文件名”,它将被覆盖每个副本声明
  • 另一个小问题是filename服务器上解析;您将无权访问该文件系统。 PostgreSQL 确实支持复制to stdout;一些驱动程序(例如,Python 的psycopg2)让您可以访问它。例如:stmt.copy_to(sys.stdout, "(select * from my_table)")stmt.copy_expert("copy (select * from my_table) to stdout csv header", sys.stdout)

标签: postgresql heroku import copy export


【解决方案1】:

基于我关于 to/from stdout/stdin 的评论,并回答有关在一个文件中包含多个表的实际问题;您可以构造输出文件以将copy ... from stdin 与实际数据交错并通过psql 加载它。例如,psql 将支持如下所示的输入文件:

copy my_table (col1, col2, col3) from stdin;
foo    bar    baz
fizz   buzz   bizz
\.

(注意结尾的\. 和分隔符应该是制表符;您还可以在复制命令中指定delimiter 选项)。

psql 将处理 ';' 之间的所有内容和 '。'作为标准输入。这实质上模拟了 pg_dump 在导出表数据且没有架构时所做的事情(例如,pg_dump -a -t my_table)。

生成的负载可以像psql mydb < output.dump 一样简单。

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 2011-04-25
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多