Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将dataframe添加到sql-将数据添加到现有表中而不重复_Python_Mysql_Pandas_Sqlalchemy - Fatal编程技术网

Python 将dataframe添加到sql-将数据添加到现有表中而不重复

Python 将dataframe添加到sql-将数据添加到现有表中而不重复,python,mysql,pandas,sqlalchemy,Python,Mysql,Pandas,Sqlalchemy,我有一个MySQL表feinstaub,其中的列(创建于,pm2.5,pm10,entry_id)c4是唯一的。我有一个列名称相等的数据框。与sql表相比,此数据框中有新值和现有值。我使用此行将数据帧发送到sql server df.to_sql("Feinstaub", con=engine, if_exists="append", index=False) 只有在数据帧中没有重复的Vlaue时,它才起作用。如果有一些傻瓜。重视它所起的作用。我找到了这个解决方案: 我最后得到了这个: df.

我有一个MySQL表feinstaub,其中的列(创建于,pm2.5,pm10,entry_id)c4是唯一的。我有一个列名称相等的数据框。与sql表相比,此数据框中有新值和现有值。我使用此行将数据帧发送到sql server

df.to_sql("Feinstaub", con=engine, if_exists="append", index=False)
只有在数据帧中没有重复的Vlaue时,它才起作用。如果有一些傻瓜。重视它所起的作用。我找到了这个解决方案:

我最后得到了这个:

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语法错误

编辑: 我现在使用这段代码,它与backticks一起工作,谢谢!但这又引起了另一个错误;)

现在我得到了以下错误:

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)']

这对我来说很有用。。。我可以多次执行脚本,只有新的值才能进入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

语法错误是什么?列名不应为单引号。使用反勾号转义空格和特殊字符。此外,显然,您必须将MatchColumn重命名为实际的列名,这些列名在这里是占位符。如果多于或少于4列,则添加或删除。
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)']
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