2016-10-24 51 views
2

我想從xlsx文件插入數據到mysqdl表中。我想插入數據在表中,如果主鍵上有重複,我想更新現有的數據,否則插入。我已經寫了腳本,但我意識到這是太多的工作,使用熊貓它很快。我如何在熊貓中實現它?插入或更新,如果存在使用熊貓的mysql

#!/usr/bin/env python3 

import pandas as pd 
import sqlalchemy 

engine_str = 'mysql+pymysql://admin:[email protected]/mydb' 
engine = sqlalchemy.create_engine(engine_str, echo=False, encoding='utf-8')\ 

file_name = "tmp/results.xlsx" 
df = pd.read_excel(file_name) 

回答

5

我能想到的兩個選項,但1號可能是清潔/更快:

1)請在更新/插入SQL決定。檢查this other question。你可以迭代你的'df'的行,從i=1n。循環用於插入,在裏面你可以寫這樣的:

query = """INSERT INTO table (id, name, age) VALUES(%s, %s, %s) 
ON DUPLICATE KEY UPDATE name=%s, age=%s""" 
engine.execute(query, (df.id[i], df.name[i], df.age[i], df.name[i], df.age[i])) 

2)定義python函數返回TrueFalse當記錄存在,然後用它在你的循環:

def check_existence(user_id): 
    query = "SELECT EXISTS (SELECT 1 FROM your_table where user_id_str = %s);" 
    return list(engine.execute(query, (user_id,)))[0][0] == 1 

你可以遍歷行並在插入之前執行此檢查

另請檢查the solution in this questionthis one too這可能適用於您的情況。

+0

我試圖避免SQL查詢本身的原因是因爲我收到的Excel經常有列值,這些列值在我可以創建查詢並插入到數據庫之前被轉義。我之所以希望pandas能非常有效地處理列值,如果有一種方法可以使用熊貓來直接插入數據,而不是執行sql查詢,這將幫助我繞過隨機值(或垃圾數據)的轉義。 – r0xette

+1

@ r0xette我不明白你爲什麼不能使用SQL查詢。你確定你不能改變列名或什麼?無論如何,使用'sqlalchemy'可以讓你避免顯式的SQL字符串查詢。 AFAIK,Pandas沒有插入vs更新行的本地方式 – cd98

+0

我現在通過轉義雙引號等方式使用SQL查詢。如果有本地執行upsert的方法,那麼我希望能夠自動轉義不良數據。 – r0xette

相關問題