在推送到Postgresql之前解决DataFrame问题

时间:2019-02-25 12:35:58

标签: python pandas dataframe

在研究过程中,我了解到DataFrame.to_sqlsqlalchemy相比将数据帧转换为csv并使用游标推送数据要慢得多。在相同的上下文中,我尝试修改代码并发现问题,同时将csv数据推入PostgreSQL。

import io,sqlalchemy as sa,pandas as pd,psycopg2
uri='postgresql://postgres:postgres@172.x.x.172:5432/dbname'
pg_con=sa.create_engine(uri)
chunk=pd.read_sql_query('SELECT TOP 10000* FROM SQL_SERVER_TABLE',pypyodbc.connect(sqlConStr))
chunk.to_sql('tbl_data', pg_con,if_exists='append',index=False)

以上代码成功执行,我在PostgreSQL表中看到数据。但是,当我转换为csv并推送时,它在所有尝试中均以不同的错误失败。

使用python 3.x转换为CSV格式:

csv_data=io.StringIO()
chunk.to_sql(csv_data,sep=',',index=False)

尝试1:使用sqlalchemy连接

pgR=pg_con.raw_connection()
pgC=pgR.cursor()
pgC.copy_from(csv_data,'user_data',sep=',',null='')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block

尝试2:使用相同的连接和光标

pgC.copy_from(csv_data.getvalue(),'user_data',sep=',',null='')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument 1 must have both .read() and .readline() methods

Attempt-3:使用psycopg2连接

conn=psycopg2.connect(uri)
pgCC=conn.cursor()
pgCC.copy_from(csv_data,'user_data',sep=',',null='')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0x00
CONTEXT:  COPY user_data, line 1: "local,2940,97,Awareness and Literacy,2.0,1318,1342,M,,,C,,2004-10-04 00:00:00.000,2..."

有人可以让我知道问题出在哪里以及我出了什么问题吗?
谢谢。

0 个答案:

没有答案