【问题标题】:Copy results from a PostgreSQL view in one DB to a table in another将结果从一个数据库中的 PostgreSQL 视图复制到另一个数据库中的表
【发布时间】:2011-12-22 18:01:59
【问题描述】:

完整的 PostgreSQL 新手。

我在 db1 中有 7-8 个视图的数据,我需要将它们复制到另一个数据库 db2 中具有匹配模式(模式?)的表中。目标数据库可能是同一个 PostgreSQL 实例,也可能是完全不同的一个实例。

我知道使用我熟悉的数据库完成此任务的 2-3 种不同方法,但我对这一种无能为力。有人可以为我建议一些基本策略吗?

在一个完美的世界里,我宁愿不必做任何感觉太像 ETL 的事情——我宁愿做一些事情

SELECT FROM instance1.db1.viewname INTO instance2.db5.tablename

然后将数据作为文本文件从视图中转储出来并重新加载到目标表中。

由于我不了解 PostgreSQL,所以我真的不知道有什么可能性。

【问题讨论】:

  • 谢谢你们俩。 dblink_connect 似乎正是我所需要的。但是,看起来该功能并未自动安装在我刚刚放在我的盒子上的发行版中。我需要从 pgAdmin 内部触发某种命令来安装它吗?
  • 没关系。发现这是一个扩展,我可以使用 pgAdmin 对有问题的数据库进行安装。我已经启动并运行了。

标签: postgresql replication etl


【解决方案1】:
CREATE TEMPORARY TABLE mytmp
AS SELECT * from myview
WHERE 1=1
;


COPY mytmp TO '/tmp/test.csv'
;

更好的方法是:

  • 将视图复制到表中(将 table1 创建为 select * from view1; ...)
  • 使用 pg_dump -t table1 -t table2 ... mydbname >myfile.out
  • 使用 myfile.out 重新创建和填充表格。

【讨论】:

  • 这种额外复制的原因是视图不能用作 COPY 语句的源或目标。创建表 AS 负责(大部分)数据类型。约束不会被复制到新表中。
【解决方案2】:

您不需要为COPY TO 创建临时表。 自 PostgreSQL 8.2 起,任何查询都可以是源。

COPY (SELECT * FROM view1) TO '/var/lib/postgres/myfile1.csv';

阅读manual about COPY。使用

在本地创建所需的表
CREATE table tbl1 AS
SELECT * FROM view1
LIMIT 0;   -- no data, just the schema.

复制 DDL 指令并在目标数据库中创建所有表。 pgAdmin 是一种方便的图形用户界面。再次删除源数据库中的空表。加载数据

COPY tbl1 FROM '/var/lib/postgres/myfile1.csv';

像@wildplasser 描述的那样转储/恢复,是另一种方式。

建议一次性转移其中一种方法。对于重复申请,dblinkSQL/MED(管理外部数据) 可能更合适。

【讨论】:

  • 糟糕。我的错。但是从文件中复制视图仍然是不可能的:-) [这实际上是一个遗憾,因为规则系统允许构建可更新的视图]
猜你喜欢
  • 1970-01-01
  • 2017-06-03
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2010-12-27
  • 1970-01-01
  • 2012-05-15
相关资源
最近更新 更多