gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

PythonでMySQLに接続、操作する(2019年風)

(追記 2019/08/21) 私のググり方が悪かったのか、

'rt'ではない方のパッケージ使っている方はちょくちょくいますね・・・

====

PythonMySQLに接続と操作をしようとしました。ググると下記記事が出てきます。

qiita.com

上記記事によると、 mysql-connector-python-rfmysql-connector-python の二つのパッケージが存在し、上記の記事は'rf'の方のパッケージについて記載されています。 rfはサポート終了してるようですので、今後はもう一つのパッケージを使うべきたと思います。

(追記8/13)また、上記記事ではSQL結果を辞書型で扱えないという旨が記載されていますが、 cursorの引数指定で扱うことが可能です。

というわけでmysql-connector-pythonを使用して、MySQLを触っていきます。

ぶっちゃけ大して使い方は変わっていないようです

ソースと参考文献

今回のソースまとめ

https://gist.github.com/gologius/b210556b7ce1f4b5ac33277bd1629e49

公式ドキュメント(詳細はここを読んでください ※英語)

MySQL :: MySQL Connector/Python Developer Guide :: 5.1 Connecting to MySQL Using Connector/Python

前準備

環境はPython実行側が Win10、Python3.7、DBサーバーはUbuntu18.04です。 MySQLの設定等はここでは触れません。

DBは下記のような構造を想定しています。

項目名 TYPE
id int
username varchar
createtime datetime

パッケージインストール

pip install mysql-connector-python

これだけ

接続

import mysql.connector

DB_HOST = "192.168.0.XXX"
DB_NAME = "your_db_name"
DB_USER = "your_db_user"
DB_PW = "your_user_pw"

conn = mysql.connector.connect(user=DB_USER, password=DB_PW, host=DB_HOST, database=DB_NAME)

INSERT

# 1レコードのみ
cur = conn.cursor()
insert_sql = "INSERT INTO USER () VALUES(%s, %s, %s);"
insert_value = (random.randint(1,100), 'testusername', datetime.datetime.now())
cur.execute(insert_sql, insert_value) #第二引数はタプル
conn.commit()

# 複数レコードある場合
insert_values = []
for i in range(10):
    v =  (random.randint(1,100), 'testusername', datetime.datetime.now())
    insert_values.append(v);

cur.executemany(insert_sql, insert_values) #第二引数はタプルリスト
conn.commit()

SELECT

(追記08/13)引数指定することで、辞書型で返却できる旨を追記

#シンプルなSQL実行
cur = conn.cursor(dictionary=True) #引数指定すると、辞書型で返してくれる
select_sql = "SELECT * FROM USER;"
cur.execute(select_sql)

# 辞書型リストを取得
data = cur.fetchall(); 

# 変数埋め込み
cur = conn.cursor() #引数に何も指定しない場合、タプルのリストが返却される
select_sql = "SELECT * FROM USER where id >= %s ORDER BY ID;"
where_value = random.randint(1,100)
cur.execute(select_sql , (where_value,)) #第二引数はタプル ※条件が一つの場合でもタプル型にする必要がある

#ループでも取り出し可能
for id, username, createtime in cur:
    print(id, username, createtime)

切断

cur.close()
conn.close()

あとがき

mysql-connector-python-rfと使い勝手はあまり変わらない気も・・・

随時追記します