2016-10-24 5 views
2

xlsxファイルからmysqdlテーブルにデータを挿入しようとしています。私はテーブルにデータを挿入したいと主キーに重複がある場合、私は既存のデータを更新したい場合は挿入します。私はすでにスクリプトを書いていますが、それはあまりにも多くの作業であり、パンダを使用することが迅速であることを認識しました。私はどのようにパンダでそれを達成できますか?pandasを使用して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

私は2つのオプションを考えることができますが、数1が速く/クリーナーかもしれません:

1)SQLは、更新/挿入を決定してください。 this other questionを確認してください。 'df'の行を、i=1からnまで繰り返すことができます。あなたが何か書くことができます挿入するためのループ内側:

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)レコードが存在するTrueまたはFalseを返し、その後、あなたのループ内でそれを使用python関数を定義:

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にエスケープされる列の値があるからです。ランダムな値(またはガベージデータ)のエスケープを回避するSQLクエリを実行するのではなく、pandasを使用して直接データを挿入する方法がある場合、pandasは列の値を非常に効率的に処理するので、私が望んでいたこと。 – r0xette

+1

@ r0xetteなぜSQLクエリを使用できないのか分かりません。列名などを変更できないのですか?いずれにしても、 'sqlalchemy'を使用すると、明示的なSQL文字列クエリを避けることができます。 AFAIK、Pandasには行を更新するかどうかを挿入するネイティブな方法がありません – cd98

+0

私はSQLクエリーを使用しています。ネイティブにアップサンプリングを実行して、悪いデータを自動的にエスケープできる方法があれば、私が望んでいたことです。 – r0xette

関連する問題