(追記 2019/08/21) 私のググり方が悪かったのか、
'rt'ではない方のパッケージ使っている方はちょくちょくいますね・・・
====
PythonでMySQLに接続と操作をしようとしました。ググると下記記事が出てきます。
上記記事によると、
mysql-connector-python-rf
とmysql-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
と使い勝手はあまり変わらない気も・・・
随時追記します