2016-11-14 4 views
1

.to_sql 함수를 사용하여 데이터를 삽입했습니다. 그러나 중복 된 삽입 데이터를 검사 할 수는 없습니다. (중복 된 테이블 만 검사 할 수 있습니다.) 아래 소스 코드를 두 번 실행하면데이터 중복없이 팬더 데이터 프레임을 데이터베이스에 삽입하려면 어떻게해야합니까?

소스 코드).

결과) 동일한 데이터가 테이블에 삽입되었습니다.

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 

어떻게 데이터 중복없이 데이터베이스에 팬더 dataframe를 삽입 할 수 있습니다?

은 (또한, 나는 데이터를로드 지역 INFILE을 사용하려고하지만 보안 문제의 이유에 의해 사용할 수 없습니다.)

답변

3

당신이 관리 권한이있는 경우 데이터베이스에, 나는 약간을 넣어 당신을 건의 할 것 테이블 자체에 대한 제약 조건. 그러면 파이썬 삽입은 예외를 발생시키고 (당신은 그것을 가로 챌 수 있습니다). 그렇지 않으면 테이블에서 데이터를 먼저 검색하고 팬더 안에 병합을 시도 할 수 있습니다. 그런 다음 모든 열을 기준으로 그룹을 만들고 존재하지 않는 데이터를 새로운 데이터 프레임으로 가져 와서 삽입합니다.

+0

나는 올바른 방향이라고 생각합니다. OP는 '기본 키'또는 '고유 키'제약 조건을 만들고 싶습니다. 그러나 반드시 관리 권한이 필요하지는 않습니다.이 테이블을 소유하고있는 스키마/사용자에 대한'ALTER TABLE' 권한으로 충분합니다. IMO는 팬더 DF로 전체 테이블을 읽고 팬더 측면에서 중복을 확인하면 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 함수를 사용하면 중복 값을 피할 수 없습니다. 같은 테이블. 코드를 다시 실행하면 동일한 데이터가 insterted 또는 occured 오류 메시지 'duplicate entry ~~' – Bethlee

+0

먼저 테이블의 데이터를 데이터 프레임으로 가져온 다음 userdata를 테이블과 비교하여 중복 된 데이터를 비교하고 최종 데이터를 기록해야합니다. to_sql이있는 테이블 – Poonam

+0

질문에 답변 해 주셔서 감사합니다. 작은 데이터에 제안을 적용하면 문제가되지 않습니다. 그러나 빅 데이터에 제안을 적용합니다. 데이터베이스의 모든 데이터를 비교할 때 효과적인 성능을 얻을 수 있습니까? – Bethlee