使用 Psycopg2 从 Redshift 写入文件引发异常
Posted
技术标签:
【中文标题】使用 Psycopg2 从 Redshift 写入文件引发异常【英文标题】:Writing to file from Redshift using Psycopg2 throwing exception 【发布时间】:2016-11-18 12:30:56 【问题描述】:我正在使用 Python 2.6,我想从名为“user_data”的表中读取来自 Redshift 的数据并使用 psycopg2 写入文件。我在“光标”中获取记录,并以这种方式尝试写入文件:
fout = open('user_data', 'w')
cursor.copy_to(fout,"user_data", sep='|')
当我执行这个时,它会抛出以下错误:
psycopg2.ProgrammingError: syntax error at or near "stdout"
LINE 1: COPY user_data TO stdout WITH DELIMITER AS
它想表达什么??这个怎么解决??
【问题讨论】:
在 AWS redshift 中可能无法使用直接复制命令,因为它不是直接的 Postgres 版本。迭代光标并将其写入文件工作正常。 【参考方案1】:很遗憾,COPY TO STDOUT
不受 Amazon Redshift 支持。您可以通过 2 种方式完成任务。第一个是按照@kadalamittai 的建议(迭代光标并在python 中写入文件),第二个是使用UNLOAD
命令。在处理大量数据时,我会推荐后者。
UNLOAD
使您能够以 CSV 文件格式将查询结果直接输出到 Amazon S3。示例:
UNLOAD ('select * from users where last_seen_dt>\'2016-11-10\'')
TO 's3://object-path/name-prefix'
更多信息about the UNLOAD
command here。
然后您可以使用boto 从 S3 下载文件:
import boto3
s3 = boto3.resource('s3')
s3_client = boto3.client('s3')
s3_client.download_file('QueryResultsBucket', 'remote_query_results.csv', 'query_results.csv')
print(open('query_results.csv').read())
【讨论】:
以上是关于使用 Psycopg2 从 Redshift 写入文件引发异常的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Psycopg2 在 Amazon Redshift 中创建表
无法使用 psycopg2 从 Amazon Redshift 读取数据
使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询
psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)