2016-11-14 2 views
1

Я использовал функцию .to_sql для вставки данных. Но он не может проверять дублированные данные вставки. (Он может проверять только дублированные таблицы)Как я могу вставить рамку данных pandas в базу данных без дублирования данных?

исходный код), когда я запускаю дважды исходный код ниже.

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, но я не могу использовать его по причине проблем безопасности.)

ответ

3

Если у вас есть права администратора на вашей базе данных, я хотел бы предложить вам поставить некоторые ограничений на самой таблице. Тогда вставка python вызовет исключение (и вы сможете перехватить его). Кроме того, вы также можете попытаться получить данные сначала из таблицы и объединить их внутри панд. Затем выполните группу по всем столбцам и получите несуществующие данные в виде нового фрейма данных и вставьте его.

+0

Я думаю, что это правильное направление - OP хотел бы создать ограничение «Первичный ключ» или «Уникальный ключ». Но им не обязательно нужны права администратора - достаточно привилегий «ALTER TABLE» для схемы/пользователя, владеющего этой таблицей. ИМО, читая всю таблицу в pandas DF и проверяя дубликаты на стороне pandas, «разрушит» идею хранения этих данных в SQL DB ... только мой 0.02 $ – MaxU

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) 
+0

с использованием функции .to_sql не может избежать дублирования значений в той же таблицы. когда вы снова запустите свой код, те же данные будут обнаружены или произойдут сообщение об ошибке «duplicate entry» ~ – Bethlee

+0

Сначала вам нужно взять данные из таблицы в dataframe, затем сравнить данные пользователя с таблицами и перетаскивать дубликаты и записать окончательные данные в стол с to_sql – Poonam

+0

Благодарим вас за ответ. Когда я применим ваше предложение к небольшим данным, все будет хорошо. Но я применяю это предложение в больших данных. Могу ли я получить эффективную производительность при сравнении всех данных в базе данных? – Bethlee

Смежные вопросы