如何在没有数据复制的情况下将pandas数据帧插入数据库?

时间:2016-11-14 08:08:20

标签: 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   2016-11-14 00:00:20 BBBB

如何在没有数据重复的情况下将pandas数据帧插入数据库?

(另外,我尝试使用本地infile的加载数据,但由于安全问题我无法使用它。)

2 个答案:

答案 0 :(得分:3)

如果您对数据库拥有管理权限,我建议您对表本身进行一些约束。然后python插入将引发异常(并且您可以拦截它)。 此外,您还可以尝试从表中检索数据并将其合并到pandas中。然后在所有列上进行分组,并将不存在的数据作为新数据帧并插入。

答案 1 :(得分:1)

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)