Python 如何在不重复数据的情况下将数据帧插入数据库?

Python 如何在不重复数据的情况下将数据帧插入数据库?,python,pandas,pymysql,Python,Pandas,Pymysql,我使用.to_sql函数插入数据。但它不能检查重复的插入数据。(只能检查重复的表) 当我运行下面两次源代码时 userData.to_sql(con=engine, name='test_quest_complete', schema='test', if_exists='append') 结果)表中插入了相同的数据 0 2016-11-14 00:00:10 AAAA 1 2016-11-14 00:00:20 BBBB 0 2016-11-14 00:00:10 AAAA 1

我使用.to_sql函数插入数据。但它不能检查重复的插入数据。(只能检查重复的表)

当我运行下面两次源代码时

userData.to_sql(con=engine, name='test_quest_complete', schema='test', if_exists='append')
结果)表中插入了相同的数据

0   2016-11-14 00:00:10 AAAA
1   2016-11-14 00:00:20 BBBB
0   2016-11-14 00:00:10 AAAA
1   2016-11-14 00:00:20 BBBB
如何在不重复数据的情况下将数据帧插入数据库


(另外,我尝试使用load data local Infle,但由于安全问题,我无法使用。)

如果您对数据库具有管理权限,我建议您对表本身设置一些约束。然后python插入将引发异常(您可以拦截它)。
否则,您也可以尝试首先从表中检索数据并将其合并到表中。然后对所有列进行分组,并将不存在的数据作为新数据框插入。

如果您对数据库拥有管理权限,我建议您对表本身进行一些约束。然后python插入将引发异常(您可以拦截它)。
import pandas as pd
import pypyodbc
from sqlalchemy import create_engine


##Data of Excel File - ExcelData(Sheet1)
##id    name
##1 11
##2 22
##3 33
##4 44
##5 55


##CREATE TABLE [test].[test_quest_complete](
##  [id] [int] NULL,
##  [name] [int] NULL
##) 


TblName="test_quest_complete"
cnxn = pypyodbc.connect("dsn=mydsn;Trusted_Connection=Yes")
engine = create_engine("mssql+pyodbc://mydsn")

file_name="C:\Users\poonamr\Desktop\ExcelData.xlsx"
xl = pd.ExcelFile(file_name)
userData = xl.parse("Sheet1")
print(userData)

sql="Select * From test." + TblName
tblData=pd.read_sql(sql,cnxn)
print(tblData)

Finalresult=pd.concat([userData, tblData]).drop_duplicates(keep=False)
print(Finalresult)

Finalresult.to_sql(TblName, engine, if_exists='append',schema='test', index=False)

否则,您也可以尝试首先从表中检索数据并将其合并到表中。然后对所有列进行分组,将不存在的数据作为新的数据框插入。

使用.to\u sql函数无法避免在同一个表中重复值。当您再次运行代码时,相同的数据将被插入或出现错误消息“duplicate entry ~~”。首先,您需要将表中的数据放入dataframe,然后将userdata与表进行比较并删除重复项,并将最终数据写入表中,以感谢您回答此问题。当我把你的建议应用到小数据上时,就可以了。但我将这一建议应用于大数据。我能在比较数据库中的所有数据时获得有效的性能吗?是的,因为在某些地方,您需要这种比较来删除重复数据,无论是在sql端还是python端。最好使用python资源,而不是数据库。使用.to_sql函数不能避免在同一个表中重复值。当您再次运行代码时,相同的数据将被插入或出现错误消息“duplicate entry ~~”。首先,您需要将表中的数据放入dataframe,然后将userdata与表进行比较并删除重复项,并将最终数据写入表中,以感谢您回答此问题。当我把你的建议应用到小数据上时,就可以了。但我将这一建议应用于大数据。我能在比较数据库中的所有数据时获得有效的性能吗?是的,因为在某些地方,您需要这种比较来删除重复数据,无论是在sql端还是python端。最好使用python资源,而不是数据库。我认为这是一个正确的方向-OP希望创建一个
主键
唯一键
约束。但它们不一定需要管理权限-
altertable
拥有此表的模式/用户的权限就足够了。IMO将整个表读入pandas DF并在pandas端检查重复项将“破坏”将这些数据存储在SQL DB中的想法。。。仅我的0.02$我认为这是一个正确的方向-OP希望创建一个
主键
唯一键
约束。但它们不一定需要管理权限-
altertable
拥有此表的模式/用户的权限就足够了。IMO将整个表读入pandas DF并在pandas端检查重复项将“破坏”将这些数据存储在SQL DB中的想法。。。就我的0.02$
import pandas as pd
import pypyodbc
from sqlalchemy import create_engine


##Data of Excel File - ExcelData(Sheet1)
##id    name
##1 11
##2 22
##3 33
##4 44
##5 55


##CREATE TABLE [test].[test_quest_complete](
##  [id] [int] NULL,
##  [name] [int] NULL
##) 


TblName="test_quest_complete"
cnxn = pypyodbc.connect("dsn=mydsn;Trusted_Connection=Yes")
engine = create_engine("mssql+pyodbc://mydsn")

file_name="C:\Users\poonamr\Desktop\ExcelData.xlsx"
xl = pd.ExcelFile(file_name)
userData = xl.parse("Sheet1")
print(userData)

sql="Select * From test." + TblName
tblData=pd.read_sql(sql,cnxn)
print(tblData)

Finalresult=pd.concat([userData, tblData]).drop_duplicates(keep=False)
print(Finalresult)

Finalresult.to_sql(TblName, engine, if_exists='append',schema='test', index=False)