Python MySQL - mysql-connector ドライバ
MySQL は最も人気のあるリレーショナルデータベース管理システムです。MySQL に詳しくない場合は、私たちのMySQL チュートリアル
この章では、mysql-connectorMySQL への接続に使用するmysql-connectorであるMySQL公式提供のドライバを紹介します。
私たちは次を使用できますpipコマンドでインストールします。mysql-connector:
python -m pip install mysql-connector
次のコードで mysql-connector が正常にインストールされたかテストします:
上記のコードを実行し、エラーが発生しなければ、インストールは成功です。
注注意:MySQL が 8.0 の場合、パスワードプラグインの検証方法が変更されています。以前のバージョンは mysql_native_password、8.0 では caching_sha2_password です。そのため、いくつか変更が必要です:
最初に my.ini の設定を変更します:
[mysqld]
default_authentication_plugin=mysql_native_password
次に mysql で以下のコマンドを実行してパスワードを変更します:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
詳細は以下を参照してください:Python MySQL8.0 接続の問題。
データベース接続の作成
以下のコードでデータベースに接続できます:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
passwd="yourpassword"
)
print(mydb)
データベースの作成
データベースの作成には「CREATE DATABASE」ステートメントを使用します。次に サンプル_db という名前のデータベースを作成します:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE DATABASE サンプル_db")
データベースを作成する前に、「SHOW DATABASES」ステートメントを使用してデータベースが存在するか確認することもできます:
demo_mysql_test.py:
すべてのデータベースのリストを出力します:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456"
)
mycursor = mydb.cursor()
mycursor.execute("SHOW DATABASES")
for x in mycursor:
print(x)
または、データベースに直接接続することもできます。データベースが存在しない場合はエラーメッセージが出力されます:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
データテーブルの作成
データテーブルの作成には"CREATE TABLE"ステートメントを使用します。作成前に、データベースが存在することを確認する必要があります。次に、sitesという名前のデータテーブルを作成します:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")
実行が成功すると、データベースに作成されたデータテーブル sites が表示されます。フィールドは name と url です。

私たちは次を使用することもできます"SHOW TABLES"ステートメントを使って、データテーブルが存在するかどうかを確認できます:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("SHOW TABLES")
for x in mycursor:
print(x)
主キーの設定
テーブル作成時には通常、主キー(PRIMARY KEY)を設定します。次を使用できます:"INT AUTO_INCREMENT PRIMARY KEY"ステートメントで主キーを作成します。主キーの開始値は 1 で、自動的に増加します。
テーブルがすでに作成されている場合は、次を使用してALTER TABLE主キーをテーブルに追加する必要があります:
demo_mysql_test.py:
sites テーブルに主キーを追加します。
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")
sites テーブルをまだ作成していない場合は、次のコードを使用して直接作成できます。
demo_mysql_test.py:
テーブルに主キーを作成します。
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")
データの挿入
データの挿入には"INSERT INTO"ステートメントを使用します:
demo_mysql_test.py:
sites テーブルに 1 件のレコードを挿入します。
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("サンプル", "https://www.example.com")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, "レコードが正常に挿入されました。")
コードを実行すると、出力結果は次のとおりです:
一括挿入
一括挿入にはexecutemany()メソッドを使用します。このメソッドの 2 番目のパラメータは、挿入するデータを含むタプルのリストです:
demo_mysql_test.py:
sites テーブルに複数のレコードを挿入します。
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
('Google', 'https://www.google.com'),
('Github', 'https://www.github.com'),
('Taobao', 'https://www.taobao.com'),
('stackoverflow', 'https://www.stackoverflow.com/')
]
mycursor.executemany(sql, val)
mydb.commit()
print(mycursor.rowcount, "レコードが正常に挿入されました。")
コードを実行すると、出力結果は次のとおりです:
上記のコードを実行した後、データテーブルのレコードを確認できます:

データレコードの挿入後にそのレコードの ID を取得したい場合は、次のコードを使用できます:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("Zhihu", "https://www.zhihu.com")
mycursor.execute(sql, val)
mydb.commit()
print("1 件のレコードが挿入されました。ID:", mycursor.lastrowid)
コードを実行すると、出力結果は次のとおりです:
データのクエリ
データのクエリにはSELECTステートメントを使用します:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
(1, 'サンプル', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')
指定したフィールドのデータを読み取ることもできます:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT name, url FROM sites")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
('サンプル', 'https://www.example.com')
('Google', 'https://www.google.com')
('Github', 'https://www.github.com')
('Taobao', 'https://www.taobao.com')
('stackoverflow', 'https://www.stackoverflow.com/')
('Zhihu', 'https://www.zhihu.com')
1 件のデータだけを読み取りたい場合は、fetchone()メソッドを使用できます:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchone()
print(myresult)
コードを実行すると、出力結果は次のとおりです:
(1, 'サンプル', 'https://www.example.com')
where 条件文
指定した条件のデータを読み取りたい場合は、whereステートメントを使用します:
demo_mysql_test.py
name フィールドが サンプル のレコードを読み取ります:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM sites WHERE name ='サンプル'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
(1, 'サンプル', 'https://www.example.com')
ワイルドカードを使用することもできます%:
demo_mysql_test.py
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM sites WHERE url LIKE '%oo%'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
(1, 'サンプル', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')
データベースクエリへの SQL インジェクション攻撃を防ぐために、次を使用できます:%sプレースホルダを使用してクエリ条件をエスケープします:
demo_mysql_test.py
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM sites WHERE name = %s"
na = ("サンプル", )
mycursor.execute(sql, na)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
ソート
クエリ結果のソートには、ORDER BYステートメントを使用します。デフォルトのソートは昇順で、キーワードはASCです。降順ソートを設定する場合は、キーワードDESC。
demo_mysql_test.py
name フィールドをアルファベットの昇順でソートします:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM sites ORDER BY name"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
(3, 'Github', 'https://www.github.com')
(2, 'Google', 'https://www.google.com')
(1, 'サンプル', 'https://www.example.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(4, 'Taobao', 'https://www.taobao.com')
(6, 'Zhihu', 'https://www.zhihu.com')
降順ソートの例:
demo_mysql_test.py
name フィールドをアルファベットの降順でソートします:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM sites ORDER BY name DESC"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
(6, 'Zhihu', 'https://www.zhihu.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(1, 'サンプル', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
Limit
クエリするデータ量を設定したい場合は、"LIMIT"ステートメントで指定できます:
demo_mysql_test.py
最初の 3 件のレコードを読み取ります:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites LIMIT 3")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
(1, 'サンプル', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
開始位置を指定することもできます。使用するキーワードはOFFSET:
demo_mysql_test.py
2 番目から最初の 3 件のレコードを読み取ります:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
コードを実行すると、出力結果は次のとおりです:
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
レコードの削除
レコードの削除には"DELETE FROM"ステートメントを使用します:
demo_mysql_test.py
name が stackoverflow のレコードを削除します:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "DELETE FROM sites WHERE name = 'stackoverflow'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, "件のレコードが削除されました")
コードを実行すると、出力結果は次のとおりです:
注意:削除ステートメントは慎重に使用してください。削除ステートメントでは WHERE 条件を必ず指定してください。指定しないと、テーブル全体のデータが削除されます。
データベースクエリへの SQL インジェクション攻撃を防ぐために、次を使用できます:%sプレースホルダを使用して削除ステートメントの条件をエスケープします:
demo_mysql_test.py
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "DELETE FROM sites WHERE name = %s"
na = ("stackoverflow", )
mycursor.execute(sql, na)
mydb.commit()
print(mycursor.rowcount, "件のレコードが削除されました")
コードを実行すると、出力結果は次のとおりです:
テーブルデータの更新
データテーブルの更新には"UPDATE"ステートメントを使用します:
demo_mysql_test.py
name が Zhihu のフィールドデータを ZH に変更します:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "UPDATE sites SET name = 'ZH' WHERE name = 'Zhihu'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, "件のレコードが変更されました")
コードを実行すると、出力結果は次のとおりです:
注意:UPDATE ステートメントでは WHERE 条件を必ず指定してください。指定しないと、テーブル全体のデータが更新されます。
データベースクエリへの SQL インジェクション攻撃を防ぐために、%s プレースホルダを使用して更新ステートメントの条件をエスケープします:
demo_mysql_test.py
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "UPDATE sites SET name = %s WHERE name = %s"
val = ("Zhihu", "ZH")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, "件のレコードが変更されました")
コードを実行すると、出力結果は次のとおりです:
テーブルの削除
テーブルの削除には"DROP TABLE"ステートメントを使用します。IF EXISTSキーワードはテーブルが存在するかどうかを判断するために使用され、存在する場合にのみ削除します:
demo_mysql_test.py
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="サンプル_db"
)
mycursor = mydb.cursor()
sql = "DROP TABLE IF EXISTS sites"
mycursor.execute(sql)
その他の拡張