我的问题本质上是这样的:当我尝试将to_sql与if_exists ='append'一起使用并且将名称设置为SQL Server上已经存在python崩溃的表时。
这是我的代码:
From AR_Open_Query as a inner join GuAccount as b ON b.ACCTNO = Trim(a.Account)
我没有包含它,但是dataTypes是所有列名及其数据类型的字典。
这是我得到的错误:
@event.listens_for(engine, 'before_cursor_execute') def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
if executemany:
cursor.fast_executemany = True
df.to_sql(name = 'existingSQLTable', con = engine, if_exists = 'append', index = False, chunksize = 10000, dtype = dataTypes)
基于这些错误,对我来说,fast_executemany标志似乎有些错误,但是我已经阅读了很多文档,并且看不到任何错误。
可能要注意的事情:
对我来说,显而易见的解决方案是将DataFrame分成900,000行的块。当第一个块成功上传后,如果没有python崩溃,我什至不能在其中添加一行。
此错误是否是旨在加快处理速度的代码的结果(它的执行效果非常好)?我误解了to_sql函数吗?还是还有其他事情发生?任何建议都很好!另外,如果有人遇到类似的问题,那真是太好了!
答案 0 :(得分:1)
正如@Jon Clements解释的那样,问题是存在具有相同主键的行(但这些行本身并不相同)。我使用了熊猫df.drop_duplicates函数,并将subset参数设置为主键列。这解决了违反PK错误的问题。