postgresql根据远程数据列创建表

时间:2018-02-07 04:55:01

标签: python-3.x postgresql

我想将一个表从远程数据库复制到我的本地Postgres数据库。我面临这些限制:

  • 我不是远程数据库的所有者,我只有select权限。
  • 该表格是view
  • 的结果
  • 因此,我相信pg_dump是不可取的。

我发现我可以在COPY中使用STDIN STDOUTPostgres。但是,COPY仅在已创建本地数据库上的表时才有效(如果我理解正确的话)。

我要复制的表格中有大约一千列。显然,我不想在CREATE TABLE中输入所有列和数据类型。对此有什么好的解决方案?

我使用的COPY命令(如果创建了表)如下(Python接口):

copyremote = "COPY (SELECT * FROM {}.{} {}) TO stdout".format(dbname, tbname, condi)
copylocal = "COPY {} FROM stdin".format(tbname)
command = ['psql', '-h', remotepg, '-U', username, '-p', port, '-d', database, '-c', copyremote]
p1 = subprocess.Popen(command, stdout=subprocess.PIPE)
p2 = subprocess.Popen(['psql', dbname, '-c', copylocal], stdin=p1.stdout,   stdout=subprocess.PIPE)
p1.stdout.close()
return p2.communicate()[0]

2 个答案:

答案 0 :(得分:0)

一种方法是将表导出到csv,将csv rsync到本地计算机,然后将csv导回到你的postgres,

使用标题导入和导出以保留表的数据类型。

  

将CSV导入到表格,其中包含第一行中显示的列的标题   csv文件。

COPY <TargetTableName> FROM '/path/to/csv/SourceCSVFile.csv' DELIMITERS ',' CSV HEADER
  

将表格导出为CSV,第一行显示标题。

COPY <SourceTableName> TO '/path/to/csv/TargetCSVFile' DELIMITERS ',' CSV HEADER;

如果您可以在远程邮局数据库上单独访问该表: 你可以使用-t选项只对特定的表

进行pg_dump
pg_dump -U your_rolename -d <database_name> -t <table_name> > file.sql

答案 1 :(得分:0)

经过一番研究,以下是我使用的解决方案:

  • 创建外部数据包装器
  • 然后创建表(喜欢your_foreign_table)
  • 然后上面的COPY命令可以通过

希望这对类似情况的人有用。