Python で MySQL を操作する一般的な方法:
- PyMysql: 純粋な Python 言語で書かれた Mysql 操作クライアント。インストールが簡単で、Python3 をサポートします。
- SQLAlchemy: これは、主にデータ テーブル構造に対応するモデルを定義することによって、基礎となるデータベース操作を提供しない非常に強力な ORM フレームワークであり、Python Web プログラミングの分野で広く使用されています。
実際のプロジェクトでは、単純なクローラや自動化の場合は PyMysql を使用することをお勧めしますが、それ以外の場合は、より強力で便利な SQLAlchemy を使用することをお勧めします。
次に、PyMySQL を使用して Mysql データベースに接続し、簡単な追加、削除、変更、クエリを実装します。
1.PyMySQLの操作
PyMySQLはPython3.x版でMySQLサーバーに接続するために使用するライブラリです。
1.PyMySQLのインストール
PyMySQL がインストールされているかどうかを確認します。
ピップリスト
インストールされていない場合は、pip コマンドを使用して PyMySQL をインストールします。
pip install PyMySQL #最新バージョンをインストールする
暗号化パッケージもインストールする必要があります。
pip インストール暗号化
Python がデータベースに接続するために使用する暗号化方法には暗号化パッケージが必要であるためです。暗号化をインストールしない場合、Python はデータベースへの接続時にエラー「: RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth Methods.」を報告します。エラー メッセージの意味は次のとおりです: sha256_password と caching_sha2_password の 2 つの暗号化方式には暗号化が必要です。
2. データベース接続
Mysql データベースに接続する前に、py_db データベースを作成します。
データベース接続: pymysql の connect() メソッドを使用して、HOST アドレス、ポート番号、ユーザー名、パスワード、操作対象のデータベース名を渡し、データベースの接続オブジェクトを取得します。
import pymysql
# 获取数据库连接
dbConn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='***',
database='py_db',
# charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = dbConn.cursor()
print(cursor) # <pymysql.cursors.DictCursor object at 0x000001D3B1768510>
# 释放资源
cursor.close()
dbConn.close()
2.1 カーソル
- カーソルを取得します。cursor() メソッドを使用して、接続オブジェクトを通じてカーソル オブジェクトを取得します。
- カーソルを解放する: 接続オブジェクトの close() メソッドを使用して、カーソル オブジェクトを解放します。
カーソルオブジェクトを使用して、操作、追加、削除、変更、確認などを行うことができます。
注意:
操作が完了したら、カーソル オブジェクトとデータベース接続オブジェクトのリソースを解放する必要があります。
3. テーブルを作成する
データベース テーブルを作成する:execute() メソッドを使用して、データベースのテーブルを作成できます。
注意:
execute() メソッドは、テーブルの作成、挿入、変更、削除、その他の操作などの標準 SQL ステートメントを実行できます。
import pymysql
# 获取数据库连接
dbConn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='123456',
database='py_db',
# charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = dbConn.cursor()
create_table_sql = "CREATE TABLE `t_user` ( \
`id` bigint NOT NULL AUTO_INCREMENT,\
`user_name` varchar(145) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\
`pazzword` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\
`sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\
`age` int DEFAULT NULL,\
`birthday` date DEFAULT NULL,\
PRIMARY KEY (`id`)\
) ENGINE=InnoDB"
# 使用 execute() 方法执行 SQL
res = cursor.execute(create_table_sql)
print(res) # 0
# 释放资源
cursor.close()
dbConn.close()
4.挿入操作
Python で SQL ステートメントを実行する一般的な方法:
- execute() メソッド: SQL ステートメントを実行します。
- executemany() メソッド: 挿入された SQL ステートメントと位置変数リストを渡します。これにより、一度に複数のデータを挿入できます。
- commit() メソッド: トランザクションをコミットし、データをデータベースに送信します。
- rowcount: これは読み取り専用プロパティであり、execute() メソッドの実行後に影響を受ける行数を返します。
4.1 レコードの挿入
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = dbConn.cursor()
insert_sql = "INSERT INTO `t_user`(`user_name`, `pazzword`, `sex`, `age`, `birthday`) VALUES ('赵云', '123456', '男', 20, now())"
try:
# 执行 SQL语句
res = cursor.execute(insert_sql)
print(res) # 1
# 提交事务
dbConn.commit()
except:
# 回滚
dbConn.rollback()
raise
finally:
# 释放资源
cursor.close()
dbConn.close()
4.2 使用变量传递参数
SQL インジェクションを防ぐために、変数を使用してパラメータを SQL ステートメントに渡すことをお勧めします。
import time
insert_sql = "INSERT INTO `t_user`(`user_name`, `pazzword`, `sex`, `age`, `birthday`) VALUES ('%s', '%s', '%s', %s, '%s')" % \
('赵云2', '123456', '男', 18, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
try:
# 执行 SQL语句
res = cursor.execute(insert_sql)
print(res) # 1
# 提交事务
dbConn.commit()
except:
# 回滚
dbConn.rollback()
raise
finally:
# 释放资源
cursor.close()
dbConn.close()
4.3 複数のレコードを挿入する
import time
insert_sql = "INSERT INTO `t_user`(`user_name`, `pazzword`, `sex`, `age`, `birthday`) VALUES (%s, %s, %s, %s, %s)"
insert_datas = [
("赵子龙1", "123456", "男", 18, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())),
("赵子龙2", "123456", "男", 19, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())),
("赵子龙3", "123456", "男", 20, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))]
try:
# 执行 SQL语句
# res = cursor.execute(insert_sql)
res = cursor.executemany(insert_sql, insert_datas)
print(res) # 3
# 提交事务
dbConn.commit()
except:
# 回滚
dbConn.rollback()
raise
finally:
# 释放资源
cursor.close()
dbConn.close()
注意:
PyMysql は、SQL ステートメント内のすべてのフィールドのパラメーター値を文字列型として扱います。
5. アップデート操作
挿入操作と同様に、SQL ステートメントを変更するだけで済みます。パラメーターを渡すには変数を使用することをお勧めします。
update_sql = 'UPDATE `t_user` SET `user_name` = %s, `pazzword` = %s, `sex` = %s, `age` = %s WHERE `id` = %s'
update_datas = ("安琪拉", "123456", "女", 18, 2)
try:
# 执行 SQL语句
res = cursor.execute(update_sql, update_datas)
print(res) # 1
# 提交事务
dbConn.commit()
...
6. 削除操作
挿入操作と同様に、SQL ステートメントを変更するだけで済みます。パラメーターを渡すには変数を使用することをお勧めします。
delete_sql = 'DELETE FROM `t_user` WHERE `id` = %s'
delete_datas = [(1),(2)]
try:
# 执行 SQL语句
res = cursor.executemany(delete_sql, delete_datas)
print(res) # 2
# 提交事务
dbConn.commit()
...
2. クエリ操作
Python でデータベースにクエリを実行する一般的な方法:
- fetchone() メソッド: 単一レコードの結果セットを返します。結果セットはオブジェクトです。
- fetchall() メソッド: すべてのレコードの結果行を返します。結果セットはリストです。
- rowcount: これは読み取り専用プロパティであり、execute() メソッドの実行後に影響を受ける行数を返します。
1. 単一レコードをクエリする
select_sql = "SELECT * FROM `t_user` WHERE id = %s "
select_datas = (5)
try:
# 执行 SQL语句
cursor.execute(select_sql, select_datas)
res = cursor.fetchone()
print(res) # {'id': 5, 'user_name': '赵子龙1', 'pazzword': '123456', 'sex': '男', 'age': 18, 'birthday': datetime.date(2023, 2, 13)}
except:
raise
finally:
# 释放资源
cursor.close()
dbConn.close()
2. 複数のレコードをクエリする
select_sql = "SELECT * FROM `t_user` WHERE id >= %s AND sex = %s"
select_datas = (5, "男")
try:
# 执行 SQL语句
cursor.execute(select_sql, select_datas)
res = cursor.fetchmany(5)
for row in res:
id = row['id']
username = row['user_name']
pazzword = row['pazzword']
sex = row['sex']
age = row['age']
birthday = row['birthday']
# 打印结果
print(row)
print("id=%s,username=%s,pazzword=%s,sex=%s,age=%s,birthday=%s" % \
(id, username, pazzword, sex, age, birthday))
except:
raise
finally:
# 释放资源
cursor.close()
dbConn.close()
3. 取引の仕組み
1. 取引の仕組み
トランザクションには、原子性、一貫性、分離性、耐久性という 4 つの属性が必要です。これら 4 つのプロパティは、多くの場合、ACID プロパティと呼ばれます。
- 原子性。トランザクションは分割できない作業単位であり、トランザクションに含まれるすべての操作は実行されるか実行されません。
- 一貫性。トランザクションでは、データベースをある一貫した状態から別の状態に変更する必要があります。一貫性と原子性は密接に関係しています。
- 隔離。トランザクションの実行は、他のトランザクションによって干渉されることはできません。つまり、トランザクション内で使用される操作とデータは他の同時トランザクションから分離されており、同時に実行されるトランザクションは互いに干渉することができません。
- 耐久性。永続性は、永続性とも呼ばれ、トランザクションがコミットされると、データベース内のデータに対する変更が永続的になることを意味します。後続の他の操作や障害が影響を与えることはありません。
2. トランザクション操作
トランザクションをサポートするデータベースの場合、Python データベース プログラミングでは、カーソルが作成されると、非表示のデータベース トランザクションが自動的に開始されます。
- commit() メソッド: 現在のカーソルに対してすべての操作を実行します。
- rollback() メソッド: 現在のカーソルのすべての操作をロールバックします。
したがって、上記の追加、削除、変更、およびクエリの操作は理解しやすいものでなければなりません。
– 知識に飢えているなら、愚かでも謙虚であれ。