mysql-connector-python - Python3

インストール

公式の MySQL コネクタライブラリで、Oracle が提供しています。

pip install mysql-connector-python

以下は、基本的な使用例です。

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="your_database",
    collation='utf8mb4_general_ci'
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
    print(row)
conn.close()

MariaDB で接続しようとすると以下のエラーが発生しました。

mysql.connector.errors.DatabaseError: 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'

mysql.connector.errors.DatabaseError: 1273 (HY000): 不明な照合順序: 'utf8mb4_0900_ai_ci'

collationを MariaDB と同じものを指定すると解決する可能性があります。

メソッド

is_connected()で接続できているかどうか確認できます。戻り値は boolean です

print(conn.is_connected())

execute()は、1つの SQL クエリを実行するためのメソッドです。

execute :

実行する

複数の処理には、executemany()を使います。

select, insert, update, delete

select

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="your_database",
    collation='utf8mb4_general_ci'
)

cursor = conn.cursor()
cursor.execute("SELECT * FROM users")

for row in cursor.fetchall():
    print(row)

conn.close()

insert

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="pythonapp",
    collation='utf8mb4_general_ci'
)

cursor = conn.cursor()

cursor.execute("INSERT INTO users (name, age) VALUES ('Jon', 24)")

# データベースに変更を確定
conn.commit()

cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
    print(row)

# カーソルを明示的に解放
cursor.close()

# データベースの接続を切断する
conn.close()

update

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="pythonapp",
    collation='utf8mb4_general_ci'
)

cursor = conn.cursor()

cursor.execute("UPDATE users SET name = 'Alis', age = 10 WHERE id = 1")

# データベースに変更を確定
conn.commit()

cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
    print(row)

# カーソルを明示的に解放
cursor.close()

# データベースの接続を切断する
conn.close() 

delete

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="pythonapp",
    collation='utf8mb4_general_ci'
)

cursor = conn.cursor()

cursor.execute("DELETE FROM users WHERE id = 1")

# データベースに変更を確定
conn.commit()

cursor.execute("SELECT * FROM users")
for row in cursor.fetchall():
    print(row)

# カーソルを明示的に解放
cursor.close()

# データベースの接続を切断する
conn.close() 

プレースホルダーとプリペアドステートメント

mysql-connector-pythonは、名前付きプレースホルダー(:name のような形式)はサポートされていません。

プレースホルダーの形式は%sのみがサポートされています。

以下は、プレースホルダーを使った例です。

# データ取得のクエリ
import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="pythonapp",
    collation='utf8mb4_general_ci'
)

cursor = conn.cursor()

select_query = "SELECT * FROM users WHERE id = %s"

cursor.execute(select_query, (8,))

print(cursor.fetchone())

conn.close() 

名前付きプレースホルダーのような使い方をしたい場合は、dict を使って値を管理する方法があります。

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="pythonapp",
    collation='utf8mb4_general_ci'
)

cursor = conn.cursor()

data = {"name": "Bob", "age": 25}
sql = "INSERT INTO users (name, age) VALUES (%(name)s, %(age)s)"

cursor.execute(sql, data)
conn.commit()

print(f"{cursor.rowcount} record inserted.")

conn.close()

以下は、プリペアドステートメントを使った例です。

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="pythonapp",
    collation='utf8mb4_general_ci'
)

cursor = conn.cursor()

cursor = conn.cursor(prepared=True)

stmt = "SELECT * FROM users WHERE id = ?"

cursor.execute(stmt, (8,))

print(cursor.fetchone())

conn.close()