【问题标题】:Pandas to_sql with sqlAlchemy duplicate entries error in mysqldbmysqldb中带有sqlAlchemy重复条目的Pandas to_sql
【发布时间】:2014-09-12 18:55:03
【问题描述】:

我正在使用带有 SQLAlchemy 的 PANDAS 使用 DataFrame.to_sql 写入 MYSQL DB。我喜欢打开'append' --> df.to_sql(con=con, name='tablename', if_exists='append') 的标志,因为该程序在白天对表进行了几次小写入,所以我不希望整个表被替换覆盖。定期,我收到重复输入错误:

sqla: valuesToCalc has error:  (IntegrityError) (1062, "Duplicate entry 
 '0-0000-00-00-00:00:00' for key 'PRIMARY'") 'INSERT INTO valuesToCalc () VALUES ()' ()

有什么方法可以将语法 "on duplicate key update" 添加到 pd.to_sql ?我是否必须停止使用to_sql 并直接使用 sqlAlchemy?我希望不要。

【问题讨论】:

    标签: pandas sqlalchemy


    【解决方案1】:

    不确定您是否找到了答案,但这里有一个对我有用的解决方法:

    在临时表上调用.to_sql(),然后使用查询用临时表更新主表。然后你可以删除临时表。比如:

    df.to_sql(con=con, name='tablename_temp', if_exists='replace')
    connection = con.connect()
    connection.execute(text("INSERT INTO tablename SELECT * FROM tablename_temp ON DUPLICATE KEY UPDATE tablename.field_to_update=tablename_temp.field_to_update"))
    connection.execute(text('DROP TABLE tablename_temp '))
    

    【讨论】:

      【解决方案2】:

      这是我最终做的:

          #df is a dataframe
          num_rows = len(df)
          #Iterate one row at a time
          for i in range(num_rows):
              try:
                  #Try inserting the row
                  df.iloc[i:i+1].to_sql(name="Table_Name",con = Engine_Name,if_exists = 'append',index=False)
              except IntegrityError:
                  #Ignore duplicates
                  pass
      

      【讨论】:

      • 顺便说一句效率很低,不推荐。
      猜你喜欢
      • 2015-06-03
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2021-12-14
      • 2017-10-12
      • 2019-08-22
      • 1970-01-01
      相关资源
      最近更新 更多