尝试将Psycopg的copy_from与stringio

时间:2019-01-26 16:33:00

标签: python pandas sqlalchemy psycopg2

我正在尝试将一堆熊猫数据帧转储到redshift集群中。我可以通过使用sql_alchemy生成连接引擎并使用df.to_sql(connection, yada, yada)来使其工作。但是,它实在太慢了,所以我想切换到批量插入方法,因为计时对于任务很重要。我发现一种方法似乎可行,但出现错误。代码如下:

output = io.StringIO()
df.to_csv(output, sep=sep, header=False, encoding=encoding)
output.seek(0)

# Insert data
connection = engine.raw_connection()
cursor = connection.cursor()
cursor.copy_from(output, table_name, sep=sep, null='')
connection.commit()
cursor.close()

在我看来这应该可行。我生成stringio对象以将数据帧保存在流中,然后放到copy_from,它不在乎输入是Stringio对象还是open(file_name,'r')对象。但是,出现此错误:

ProgrammingError: syntax error at or near "stdin"
LINE 1: COPY analytics.customer_data FROM stdin WITH DELIMITER AS ' ' NULL A...  

该表位于模式“ analytics”中,称为“ customer_data”。我假设stdin意味着我没有正确地将它传递给StringIO,但我不知道为什么。我还可以通过将数据转储到硬盘驱动器CSV然后运行copy_from来完成此工作,但是由于此过程是在一个很小的docker容器中旋转的,所以我的内存空间有限,因此将这些文件存储到硬盘驱动器的开销变得很烦人。我宁愿从StringIO转储。

0 个答案:

没有答案