Python pymsql模組

雲崖先生發表於2020-09-04

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()

遊標概念

   可以看到在上面的示例中有一個遊標的概念,其實這個也非常簡單,就等同於游標的上下移動,每移動一次代表一條記錄。

   first

   在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()

相關文章