【问题标题】:pandas dataframe to sql - append data to exisitng table without duplicationpandas dataframe to sql - 将数据附加到现有表而不重复
【发布时间】:2018-12-07 19:26:36
【问题描述】:

我有一个 MySQL 表 feinstaub,其列 (created_at,PM 2.5,PM 10,entry_id) c4 是唯一的。我有一个具有相同列名的熊猫数据框。在这个数据框中是新值和已经存在的值与 sql 表进行比较。我使用这一行将数据帧发送到 sql server。

df.to_sql("Feinstaub", con=engine, if_exists="append", index=False)

它仅在数据框中没有重复值时才有效。如果有一些重复。值它不起作用。我找到了这个解决方案:Pandas to_sql() to update unique values in DB?

with engine.begin() as cn:
   sql = """INSERT INTO myFinalTable (Col1, Col2, Col3, ...)
            SELECT t.Col1, t.Col2, t.Col3, ...
            FROM myTempTable t
            WHERE NOT EXISTS 
                (SELECT 1 FROM myFinalTable f
                 WHERE t.MatchColumn1 = f.MatchColumn1
                 AND t.MatchColumn2 = f.MatchColumn2)"""

   cn.execute(sql)

我最终得到了这个:

df.to_sql("temp_feinstaub_wohnzimmer", con=engine, if_exists="replace", index=False)
with engine.begin() as cn:
   sql = """INSERT INTO feinstaub (created_at, 'PM 2.5' , 'PM 10', entry_id)
            SELECT t.Column1, t.Column2, t.Column3 ,t.Column4
            FROM temp_feinstaub_wohnzimmer t
            WHERE NOT EXISTS
                (SELECT 1 FROM feinstaub f
                 WHERE t.MatchColumn1 = f.MatchColumn1
                 AND t.MatchColumn2 = f.MatchColumn2
                 AND t.MatchColumn3 = f.MatchColumn3
                 AND t.MatchColumn4 = f.MatchColumn4)"""

   cn.execute(sql)

它引发了一个 sql 语法错误。我也尝试重命名 f.MatchColumn 但仍然给我一个 sql 语法错误?

编辑: 我现在使用此代码,它与反引号一起使用,谢谢!但它引发了另一个错误;)

#Send the Data to SQL database
df.to_sql("temp_feinstaub_wohnzimmer", con=engine, if_exists="replace", index=False)
with engine.begin() as cn:
   sql = """INSERT INTO feinstaub (created_at, `PM 2.5` , `PM 10`, entry_id)
            SELECT t.created_at, t.`PM 2.5`, t.`PM 10` ,t.entry_id
            FROM temp_feinstaub_wohnzimmer t
            WHERE NOT EXISTS
                (SELECT 1 FROM feinstaub f
                 WHERE t.created_at = f.created_at
                 AND t.`PM 2.5` = f.`PM 2.5`
                 AND t.`PM 10` = f.`PM 10`
                 AND t.entry_id = f.entry_id)"""

   cn.execute(sql)

现在我得到以下错误:

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1062, "Duplicate entry '3825' for key 'entry_id'") [SQL: 'INSERT INTO feinstaub_wohnzimmer (created_at, `PM 2.5` , `PM 10`, entry_id)\n            SELECT t.created_at, t.`PM 2.5`, t.`PM 10` ,t.entry_id\n            FROM temp_feinstaub_wohnzimmer t\n            WHERE NOT EXISTS\n                (SELECT 1 FROM feinstaub_wohnzimmer f\n                 WHERE t.created_at = f.created_at\n                 AND t.`PM 2.5` = f.`PM 2.5`\n                 AND t.`PM 10` = f.`PM 10`\n                 AND t.entry_id = f.entry_id)']

【问题讨论】:

  • 什么是语法错误?列名不应单引号。使用反引号转义空格和特殊字符。此外,显然,您必须将 MatchColumn 重命名为实际的列名,这些列名是此处的占位符。如果多于或少于 4 列,则添加或删除。

标签: python mysql pandas sqlalchemy


【解决方案1】:

这样对我有用...我可以多次执行脚本,只有新值才能进入 mysql 数据库。

from sqlalchemy import exc
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="feinstaub_wohnzimmer",con = engine,if_exists = 'append',index=False)
    except exc.IntegrityError:
        #Ignore duplicates
        pass

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 2019-06-08
    • 2018-05-06
    • 2019-05-21
    • 2017-05-21
    • 1970-01-01
    • 2013-08-14
    • 2019-04-13
    • 2015-03-06
    相关资源
    最近更新 更多