インストール
公式の 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()を使います。
fetchall()は、SQLクエリの実行結果からすべての行を取得し、リスト形式で返すメソッドです。
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()
オブジェクトとして取得
SQLの結果を「カラム名をキーにした辞書(オブジェクト)」として取得するには、
C拡張用の辞書カーソルか、もしくは、純正Python版ドライバで接続する2通りの方法があります。
C拡張用の辞書カーソルを使う
from flask import render_template, request, redirect
import mysql.connector
from mysql.connector.cursor_cext import CMySQLCursorDict
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="sample",
collation='utf8mb4_general_ci'
)
class MyappController:
def index(self):
# ホーム画面のためのロジック
cursor = conn.cursor(cursor_class=CMySQLCursorDict)
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
print(users)
conn.close()
return render_template('myapp/index.html', users=users)
純正Python版ドライバで接続
from flask import render_template, request, redirect
import mysql.connector
from mysql.connector.cursor import MySQLCursorDict
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="sample",
collation='utf8mb4_general_ci',
use_pure=True
)
class MyappController:
def index(self):
# ホーム画面のためのロジック
cursor = conn.cursor(cursor_class=MySQLCursorDict)
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()
print(users)
conn.close()
return render_template('myapp/index.html', users=users)