PyMySQLとは
Python3.xに接続するためのPyMySQLはMySQL
、ライブラリサーバーをリリースします。Python2はmysqldbを使用しています。
PyMySQLのインストール
pip install PyMySQL
データ接続の公式事例
# 表结构
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT, # id 整型 不能为空 自动增长
`email` varchar(255) COLLATE utf8_bin NOT NULL, # 邮箱 可变字符串 区分大小写,不能为空
`password` varchar(255) COLLATE utf8_bin NOT NULL, # 密码 可变字符串 区分大小写,不能为空
PRIMARY KEY (`id`) # id 为主键
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1 ;
# InnoDB 引擎 默认 utf-8 编码 区分大小写 自动增长从1开始
python操作
import pymysql.cursors
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# 创建一条新的记录
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cursor.execute(sql, ('[email protected]', 'very-secret'))
# 连接完数据库并不会自动提交,所以需要手动 commit 你的改动
connection.commit()
with connection.cursor() as cursor:
# 读取单条记录
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
cursor.execute(sql, ('[email protected]',))
result = cursor.fetchone()
print(result)
finally:
connection.close()
ここでは2つの連続したwithが使用されていることに注意してください。利点は、withが終了した後、カーソルが自動的に閉じられることです。 cursor.close()
出力
{'password': 'very-secret', 'id': 1}
データベース接続
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
ホスト、ユーザー、パスワードなどに加えて、ここから選択できる多くのパラメーターがあります。
パラメータ | 説明 |
---|---|
ホスト | データベースサーバーアドレス、デフォルトのlocalhost |
ユーザー | ユーザー名。デフォルトは、現在実行中のプログラムユーザーです。 |
パスワード | ログインパスワード。デフォルトは空の文字列です |
データベース | デフォルトの操作データベース |
ポート | データベースポート。デフォルトは3306です。 |
文字コード | データベースエンコーディング |
connect_timeout | 接続タイムアウト時間、デフォルト10、最小1、最大31536000 |
max_allowed_packet | サーバーに送信されるデータの最大量。デフォルトは16MBです。 |
カーソル
データベースに接続したら、カーソルを取得して、操作や送信などを実行します。
cursor = connection.cursor()
クエリを実行すると、返されるデフォルトのデータタイプはタプルであり、戻りタイプは変更できます。
一般的に使用されるいくつかのカーソルタイプ:
Cursor
:デフォルト、タプルタイプDictCursor
:辞書タイプSSCursor
:バッファなしタプルタイプSSDictCursor
:バッファなし辞書タイプ
バッファなしのカーソルタイプ。大量のデータ、1回限りの戻りが遅すぎる、またはサーバー帯域幅が小さい場合に適しています。
接続を作成するときは、cursorclass
パラメータを使用してタイプを指定します。
connection = pymysql.connect(host='localhost',
user='root',
password='root',
db='db',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
カーソルを作成するときにタイプを指定することもできます。
cursor = connection.cursor(cursor=pymysql.cursors.DictCursor)
データベーステーブルを作成する
データベース接続が存在する場合は、execute()メソッドを使用してデータベースのテーブルを作成できます。次に示すように、テーブルEMPLOYEEを作成します。
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# 关闭数据库连接
db.close()
データベース挿入操作
次の例では、SQL INSERTステートメントを使用して、テーブルEMPLOYEEにレコードを挿入します。
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# 关闭数据库连接
db.close()
上記の例は、次のように書くこともできます。
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', %s, '%s', %s)" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# 执行sql语句
cursor.execute(sql)
# 执行sql语句
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
データベースクエリ操作
PythonクエリMysqlは、fetchone()メソッドを使用して単一のデータを取得し、fetchall()メソッドを使用して複数のデータを取得します。
- fetchone():このメソッドは、次のクエリ結果セットを取得します。結果セットはオブジェクトです
- ** fetchall():**返されたすべての結果行を受け取ります。
- rowcount:これは読み取り専用属性であり、execute()メソッドの影響を受ける行数を返します。
例:
EMPLOYEEテーブルの1000を超えるsalary(salary)フィールドのすべてのデータをクエリします。
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")
# 关闭数据库连接
db.close()
上記のスクリプトの実行結果は次のとおりです。
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
データベース更新操作
更新操作は、データテーブルのデータを更新するために使用されます。次の例では、TESTDBテーブルのSEXが「M」であるAGEフィールドをインクリメントします。
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
削除操作
削除操作は、データテーブル内のデータを削除するために使用されます。次の例は、AGEが20より大きいデータテーブルEMPLOYEE内のすべてのデータを削除する方法を示しています。
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭连接
db.close()
トランザクションを実行する
トランザクションメカニズムにより、データの一貫性を確保できます。
トランザクションには、アトミック性、一貫性、分離、および耐久性の4つの属性が必要です。これらの4つの属性は、通常、ACID特性と呼ばれます。
- アトミシティ(
atomicity
)。トランザクションは分割できない作業単位であり、トランザクションに含まれるすべての操作は実行されるか実行されないかのいずれかです。 - 一貫性(
consistency
)。トランザクションは、データベースをある一貫した状態から別の一貫した状態に変更する必要があります。一貫性と原子性は密接に関連しています。 - 分離(
isolation
)。トランザクションの実行は、他のトランザクションによって妨害されることはありません。つまり、トランザクションの内部操作と使用されるデータは、他の同時トランザクションから分離されており、同時に実行される各トランザクションが相互に干渉することはありません。 - 永続性(
durability
)。永続性は永続性とも呼ばれます。つまり、トランザクションがコミットされると、データベース内のデータへの変更は永続的である必要があります。以下の他の操作または失敗は、それに影響を与えるべきではありません。
Python DB API 2.0のトランザクションには、コミットまたはロールバックの2つのメソッドがあります。
インスタンス
# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 向数据库提交
db.commit()
except:
# 发生错误时回滚
db.rollback()
トランザクションをサポートするデータベースの場合、Pythonデータベースプログラミングでは、カーソルが作成されると、非表示のデータベーストランザクションが自動的に開始されます。
Commit()メソッドはすべての更新操作にカーソルを合わせ、rollback()
メソッドは現在のカーソルのすべての操作をロールバックします。各メソッドは新しいトランザクションを開始します。
2つの近い
通常、データベースの操作を最後に終了するために使用され、最終的に書き込むことができます
データベース接続を閉じる
connection.close()
カーソルを閉じる
cursor.close()
そして、sqlインジェクションを防ぎます
入力を操作してバックグラウンドSQLステートメントを変更する
#正常构造语句的情况
sql="select user,pass from tb7 where user='%s' and pass='%s'" % (user,passwd)
row_count=cursor.execute(sql)
#拼接语句被构造成下面这样,永真条件,此时就注入成功了。
select user,pass from tb7 where user='u1' or '1'-- ' and pass='u1pass'
この状況を回避するには、pymysqlが提供するパラメーター化されたクエリを使用できます。
#避免注入,使用pymysql提供的参数化语句
user="u1' or '1'-- "
passwd="u1pass"
#执行参数化查询
row_count=cursor.execute("select user,pass from tb7 where user=%s and pass=%s",(user,passwd))
# 内部执行参数化生成的SQL语句,对特殊字符进行了加\转义,避免注入语句生成。
sql=cursor.mogrify("select user,pass from tb7 where user=%s and pass=%s",(user,passwd))
print(sql)
# 被转义的语句
select user,pass from tb7 where user='u1\' or \'1\'-- ' and pass='u1pass'
参照リンク:https://www.jianshu.com/p/1ba64df4fd15
https://www.runoob.com/python3/python3-mysql.html
ITの紹介にご注目いただきありがとうございます|実践アドレス:www.520mg.com/it