Python MySQL - mysql-connector ドライバ

MySQL は最も人気のあるリレーショナルデータベース管理システムです。MySQL に詳しくない場合は、私たちのMySQL チュートリアル

この章では、mysql-connectorMySQL への接続に使用するmysql-connectorであるMySQL公式提供のドライバを紹介します。

私たちは次を使用できますpipコマンドでインストールします。mysql-connector:

python -m pip install mysql-connector

次のコードで mysql-connector が正常にインストールされたかテストします:

demo_mysql_test.py:

import 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, "レコードが正常に挿入されました。")

コードを実行すると、出力結果は次のとおりです:

1 记录插入成功

一括挿入

一括挿入には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, "レコードが正常に挿入されました。")

コードを実行すると、出力結果は次のとおりです:

4 记录插入成功。

上記のコードを実行した後、データテーブルのレコードを確認できます:

データレコードの挿入後にそのレコードの 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)

コードを実行すると、出力結果は次のとおりです:

1 条记录已插入, ID: 6

データのクエリ

データのクエリには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() # 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") # 0 は 1 番目、1 は 2 番目、以下同様です 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, "件のレコードが削除されました")

コードを実行すると、出力結果は次のとおりです:

1  条记录删除

注意:削除ステートメントは慎重に使用してください。削除ステートメントでは 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, "件のレコードが削除されました")

コードを実行すると、出力結果は次のとおりです:

1  条记录删除

テーブルデータの更新

データテーブルの更新には"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, "件のレコードが変更されました")

コードを実行すると、出力結果は次のとおりです:

1  条记录被修改

注意: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, "件のレコードが変更されました")

コードを実行すると、出力結果は次のとおりです:

1  条记录被修改

テーブルの削除

テーブルの削除には"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" # データテーブル sites を削除 mycursor.execute(sql)
その他の拡張