熊猫to_sql“追加”到现有表会导致Python崩溃

时间:2018-07-26 18:46:14

标签: python-3.x pandas sql-server-2012 sqlalchemy pandas-to-sql

我的问题本质上是这样的:当我尝试将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标志似乎有些错误,但是我已经阅读了很多文档,并且看不到任何错误。

可能要注意的事情:

  1. if_exists ='replace'尚不存在的表可以正常工作
  2. if_exists ='append'尚不存在的表可以正常工作
  3. if_exists ='replace'已经存在的表可以正常工作
  4. 我的DataFrame大约有300万行和25列(主要是浮点数和一些短字符串)
  5. 我可以成功写入900,000行的绝对最大值,而不会导致python崩溃。
  6. 我正在使用SQL Server,pandas 0.23.3,pyodbc 4.0.23(我在4.0.22中也遇到了相同的错误),Jupyter Notebook(我也在IDLE中尝试了相同的结果), Windows 10,Python 3.5.1和Anaconda 3。

对我来说,显而易见的解决方案是将DataFrame分成900,000行的块。当第一个块成功上传后,如果没有python崩溃,我什至不能在其中添加一行。

此错误是否是旨在加快处理速度的代码的结果(它的执行效果非常好)?我误解了to_sql函数吗?还是还有其他事情发生?任何建议都很好!另外,如果有人遇到类似的问题,那真是太好了!

1 个答案:

答案 0 :(得分:1)

正如@Jon Clements解释的那样,问题是存在具有相同主键的行(但这些行本身并不相同)。我使用了熊猫df.drop_duplicates函数,并将subset参数设置为主键列。这解决了违反PK错误的问题。