mysql-connector-pythonを導入する

2019年2月14日

Python3でMySQLに接続したい。

環境

  • macOS 10.13.6
  • Python 3.7.1
  • conda 4.5.12
選択肢としては以下の3つ。
  • mysql-connector-python
  • mysql-connector-python-rf
  • mysqlclient
MySQL公式クライアントで、かつアップデートもされている点でmysql-connector-pythonを入れる。

パッケージのインストール


$ pip install mysql-connector-python

接続


import mysql.connector

# 接続
config = {
    'user': 'sample_user',
    'password': 'password',
    'host': 'localhost',
    'database': 'sample_db'
}
cnx = mysql.connector.connect(**config)
cur = cnx.cursor()

CREATE TABLE


# テーブル作成
def create_table():
    query = """CREATE TABLE IF NOT EXISTS sample_table (
        id int NOT NULL,
        name VARCHAR(20) NOT NULL
        )"""
    cur.execute(query)

  • ダブルクオテーション(")を3つ続けて書くことで改行を含む文字列を代入できる。

INSERT


# データ挿入
def insert():
    try:
        query = "INSERT INTO sample_table (id, name) VALUES (%s, %s)"

        # 単一行挿入
        cur.execute(query, (1, "hoge"))

        # タプルで複数行挿入
        dataset_tpl = [
            (2, "fuga"),
            (3, "piyo"),
            (4, "hogefuga"),
            (5, "fugafuga")
        ]

        # リストでもいける
        dataset_list = [
            [2, "fuga"],
            [3, "piyo"],
            [4, "hogefuga"],
            [5, "fugafuga"]
        ]

        cur.executemany(query, dataset_list)

        # データのコミット
        cnx.commit()

    except Exception as e:
        # エラー時にロールバック
        cnx.rollback()
        raise e

  • executeの第二引数にはタプルもリストも使える
  • commit()をしないと変更内容が確定されないので注意

SELECT


# データ取得
def select():
    # 全件取得
    query = "SELECT * FROM sample_table"
    cur.execute(query)

    print("all:")
    rows = cur.fetchall()
    for row in rows:
        print(row)

    # テーブル名を変数で入れる場合は文字列でつなぐ
    table_name = "sample_table"

    # プリペアードステートメントで絞り込み
    query = "SELECT * FROM " + table_name + " WHERE name = %s"
    cur.execute(query, ["hoge"])

    print("hoge:")
    rows = cur.fetchall()
    for row in rows:
        print(row)

  • テーブル名にはプリペアードステートメントを使用できないので、文字列でつなぐ。エスケープした方が安全なので、このページを見て試そうとしたが、AttributeError: 'CMySQLConnection' object has no attribute 'escape_string' と出てしまい謎なので後々…

参考