我想将一个表从远程数据库复制到我的本地Postgres
数据库。我面临这些限制:
view
。pg_dump
是不可取的。我发现我可以在COPY
中使用STDIN
STDOUT
和Postgres
。但是,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]
答案 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_dumppg_dump -U your_rolename -d <database_name> -t <table_name> > file.sql
答案 1 :(得分:0)
经过一番研究,以下是我使用的解决方案:
希望这对类似情况的人有用。