開発環境
  • Python:3.8.2
  • Flask:1.1.2
  • mysqlclient:1.4.6
  • MySQL:8.0

MySQLへの接続

MySQLの情報
  • ホスト:localhost
  • データベース:sample
  • ユーザ:root
  • パスワード:root
  • 文字コード設定:デフォルト(UTF-8)

上記設定のもと、下記のコードでPythonからMySQLの接続が可能です。

import MySQLdb


def get_connection():
    conn = MySQLdb.connect(user="root", passwd="root",
                           host="localhost", db="sample", charset="utf8mb4")

Flaskであれば、インポートしているMySQLdbというライブラリは標準で入っています。

文字コードの設定は要注意です。

カーソルの作成

他の言語などであれば「コネクションオブジェクトがあればあとはSQL投げるだけ」と考えがちですが、PythonではSQLの実行までにもうひと手間必要です。

cur = conn.cursor(MySQLdb.cursors.DictCursor)

引数に「MySQLdb.cursors.DictCursor」を指定していますが、必須ではありません。

上記設定をすると、SELECT文実行時に結果が辞書型で帰ってきます。

SQLの実行

SQLの実行例を下記に示します。

import MySQLdb


def get_connection():
    conn = MySQLdb.connect(user="root", passwd="root",
                           host="localhost", db="sample", charset="utf8mb4")
    cur = conn.cursor(MySQLdb.cursors.DictCursor)

    sql = "insert into user (name, mail) values (%s, %s);"

    cur.execute(sql, ("name","mail"))
    conn.commit()

    sql = "select * from user;"

    cur.execute(sql)
    rows = cur.fetchall

    for row in rows:
        print(row["name"])
        print(row["mail"])

SQL文にバインドを行う場合は「%s」を使い、SQL実行時に第2引数として渡します。

INSERT文やUPDATE文実行時にはcommitメソッドを忘れないように注意しましょう。

※私の環境だけかもしれませんが、commitメソッドはインテリセンスが働いてくれませんでした…。

SELECT文の結果はfetchallまたはfetchoneメソッドで取得できます。

取得した結果の各要素に関しては名前指定でアクセスすることが出来ます。

最後に

開発当初は本記事でご紹介しているFlask標準のMySQLdbというライブラリを使用していましたが、最終的には別のライブラリを使いました。

その理由に関してはまた後程…。

以上です。

スポンサーリンク