這篇文章運用簡單易懂的例子給大家介紹Python 中如何使用pymsql模塊,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
基本使用
首先要下載 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()
關于Python 中如何使用pymsql模塊就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。