pymsql
pymysql
這款第三方庫可以幫助我們利用python
語言與mysql
進行連結
基本使用
首先要下載pymysql
pip install pymsql
以下是pymysql
的基本使用
import pymysql
# 連結,C/S架構,TCP連結
conn = pymysql.connect(
host="localhost",
database="db1",
charset="utf8mb4",
user="root",
cursorclass=pymysql.cursors.DictCursor, # 記錄結果,字典顯示
# password = "your password",
)
# 遊標
cursor = conn.cursor()
# 執行sql
sql = "show tables"
res = cursor.execute(sql) # 提交執行,返回sql影響成功的行數
print(res) # 2 代表該資料庫下有2個表
print(cursor.fetchall()) # [{'Tables_in_db1': 't1'}, {'Tables_in_db1': 't2'}]
cursor.close() # 關閉遊標
conn.close()
遊標概念
可以看到在上面的示例中有一個遊標的概念,其實這個也非常簡單,就等同於游標的上下移動,每移動一次代表一條記錄。
在pymsql
中,對於select
等操作返回的結果都可以通過遊標的移動配合相應方法函式來進行讀取。
sql注入
如果你的某些sql
語句要進行字串拼接,那麼一定要使用pymysql
提供的execute()
方法進行拼接,不要去用python
中的%
或format()
方法,這可能導致出現sql
注入問題帶來不安全的隱患。
注意:使用
execute()
時,不可傳入表名,資料庫名。否則會丟擲語法錯誤,這是因為在拼接時會自動新增上``號
import pymysql
# 連結
conn = pymysql.connect(
host="localhost",
database="db1",
charset="utf8mb4",
user="root",
cursorclass=pymysql.cursors.DictCursor, # 記錄結果,字典顯示
# password = "your password",
)
# 遊標
cursor=conn.cursor()
# 執行sql
sql = "select * from t1 where id=%s"
res = cursor.execute(sql,("1",)) # 提交執行,返回sql影響成功的行數 這裡拼接能預防sql注入問題
print(res) # 1 查出一條記錄
print(cursor.fetchall()) # 拿到所有記錄的結果
cursor.close() # 關閉遊標
conn.close()
事務提交
在執行UPDATE/INSERT/DELETE
之類的操作,必須使用conn.commit()
進行事務提交後方可生效。
或者你可以在例項化conn
物件時為他指定auto_commit
引數為true
即可自動提交事務。
import pymysql
# 連結
conn = pymysql.connect(
host="localhost",
database="db1",
charset="utf8mb4",
user="root",
cursorclass=pymysql.cursors.DictCursor, # 記錄結果,字典顯示
autocommit = True, # 自動提交
# password = "your password",
)
# 遊標
cursor=conn.cursor()
# 執行sql
sql = "insert into t1(name) values(%s)"
res = cursor.execute(sql,("新記錄",)) # 提交執行,返回sql影響成功的行數 這裡拼接能預防sql注入問題
print(res) # 1 成功插入一條記錄
print(cursor.lastrowid) #在插入語句後檢視,檢視最後一條記錄的行號
print(cursor.fetchall())
# conn.commit() # 手動提交
cursor.close() # 關閉遊標
conn.close()
提交多條
使用cursor.executemany()
方法可一次性提交多條sql
操作。
import pymysql
# 連結
conn = pymysql.connect(
host="localhost",
database="db1",
charset="utf8mb4",
user="root",
cursorclass=pymysql.cursors.DictCursor, # 記錄結果,字典顯示
autocommit = True, # 自動提交
# password = "your password",
)
# 遊標
cursor=conn.cursor()
# 執行sql
sql = "insert into t1(name) values(%s)" # 同一條命令,執行3次
res = cursor.executemany(sql,[("新記錄1"),("新紀錄2"),("新紀錄3")]) # 提交執行,返回sql影響成功的行數 這裡拼接能預防sql注入問題
print(res) # 3 成功插入三條記錄
print(cursor.lastrowid) #在插入語句後檢視,檢視最後一條記錄的行號
print(cursor.fetchall())
cursor.close() # 關閉遊標
conn.close()
遊標相關
獲取到一條記錄後,我們可以控制遊標移動。
也可以控制檢視遊標後的多少條記錄
遊標每移動一次代表一條記錄
命令解析 | 描述 |
---|---|
cursor.scroll(3,mode='absolute') | 遊標以絕對位置向後移動3條記錄 |
cursor.scroll(3,mode='relative') | 遊標以當前位置向後移動3條記錄 |
注意:遊標移動的條數即為記錄的條數,如果移動值為負N就代表上N條記錄 |
如果我們想獲取記錄,可使用以下三個方法
命令解析 | 描述 |
---|---|
cursor.fetchone() | 獲取第一條記錄,遊標向下移動一行 |
cursor.fetchmany(2) | 獲取接下來的兩條記錄,遊標向下移動兩行 |
cursor.fetchall() | 獲取全部記錄,遊標移動到末尾,返回的是一個列表 |
import pymysql
# 連結
conn = pymysql.connect(
host="localhost",
database="db1",
charset="utf8mb4",
user="root",
cursorclass=pymysql.cursors.DictCursor, # 記錄結果,字典顯示
autocommit = True, # 自動提交
# password = "your password",
)
# 遊標
cursor=conn.cursor()
# 執行sql
sql = "select * from t1" # t1表中4條記錄
cursor.execute(sql)
print(cursor.fetchone()) 遊標移動到2的位置
cursor.scroll(2,mode='relative') 向下移動2,當前遊標為4
print(cursor.fetchone())
cursor.close() # 關閉遊標
conn.close()
"""
{'id': 1, 'name': '記錄1'}
{'id': 4, 'name': '記錄4'}
"""
插入行號
如果執行的是INSERT
操作,可以在插入後檢視最後插入的ID
行號
import pymysql
# 連結
conn = pymysql.connect(
host="localhost",
database="db1",
charset="utf8mb4",
user="root",
cursorclass=pymysql.cursors.DictCursor, # 記錄結果,字典顯示
autocommit = True, # 自動提交
# password = "your password",
)
# 遊標
cursor=conn.cursor()
# 執行sql
sql = "insert into t1(name) values(%s)" # 同一條命令,執行3次
res = cursor.executemany(sql,[("新記錄1"),("新紀錄2"),("新紀錄3")]) # 提交執行,返回sql影響成功的行數 這裡拼接能預防sql注入問題
print(res) # 3 成功插入三條記錄
print(cursor.lastrowid) #在插入語句後檢視,檢視最後一條記錄的行號
print(cursor.fetchall())
# conn.commit() # 手動提交
cursor.close() # 關閉遊標
conn.close()