MySQL儲存 pymysql模組
阿新 • • 發佈:2022-11-29
目錄
pymysql模組
基本使用 cursor=pymysql.cursors.DictCursor
pymysql模組 pip3 install pymysql import pymysql # 1.連線MySQL服務端 db = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', db='db4_03', charset='utf8mb4' ) # 2.產生遊標物件 # cursor = db.cursor() # 括號內不填寫額外引數 資料是元組 指定性不強 [(),()] cursor = db.cursor(cursor=pymysql.cursors.DictCursor) # [{},{}] # 3.編寫SQL語句 # sql = 'select * from teacher;' sql = 'select * from score;' # 4.傳送SQL語句 affect_rows = cursor.execute(sql) # execute也有返回值 接收的是SQL語句影響的行數 print(affect_rows) # 5.獲取SQL語句執行之後的結果 res = cursor.fetchall() print(res)
獲取資料 fetchall
fetchall() 獲取所有的結果
fetchone() 一次讀一個數據,每次都基於上次的位置往後面讀。
fetchmany() 獲取指定數量的結果集資料
ps:注意三者都有類似於檔案游標移動的特性
讀取結果集可以類比讀取檔案 游標讀取到末尾了 再繼續讀就沒有內容了 所以多次使用fetchall 第二次及以後都獲取的是空。
fetchall:
fetchone:
移動游標 scroll
cursor.scroll(1,'relative') # 基於當前位置往後移動1位 cursor.scroll(1,'absolute') # 基於資料的開頭往後移動一位 注意這個輸入的數字 是要≥0的。
≥0的
增刪改二次確認 commit autocommit=True
在pymysql.connect裡新增autocommit=True
# 可以針對增 刪 改的操作 進行自動確認(無需寫程式碼二次確認)
db.commit() # 針對 增 刪 改 需要二次確認(程式碼確認)
補充方法 rowcount rollback
對於游標物件:
cursor.rowcount # 用於獲取查詢結果的條數
對於connect方法產生的db物件:
rollback # 資料回滾 用於增刪改出錯的情況 將資料庫狀態回覆到commit之前 相當於什麼事都沒發生
確保資料的一致性
插入一條資料,要麼全部插入要麼都不插入,不會出現插入一半的情況,這稱之為事務的原子性。
增刪改都是對資料庫進行更改的操作,而更改操作都必須是一個事務,所以這些操作的標註寫法是:
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
引入動態字典生成SQL語句
新增欄位的時候需要修改我們構建的SQL語句,這不是我們想要的。所以引入字典動態生成SQL:
import pymysql
db = pymysql.connect(host='localhost',
port=3306,
user='root',
passwd='123',
db='db1', # can be changed
charset='utf8mb4', # default
autocommit=True, # set to True
)
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
# dict
data = {
'id': '2200320',
'name': 'John Doe',
'age': '12',
}
table = 'students'
keys = ','.join(data.keys()) # create a str like 'id,name,age'
values = ','.join(['%s'] * len(data)) # make format symbols like '%s,%s,%s'
sql = 'INSERT INTO {table} ({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
print(sql) # INSERT INTO students (id,name,age) VALUES (%s,%s,%s)
try:
if cursor.execute(sql,tuples=(data.values())):
print('Success')
db.commit()
except Exception:
print('Error')
db.rollback()
db.close()
更新資料時的主鍵配置 ON DUPLICATE KEY UPDATA
在某些應用情境下,我們關心表中會不會出現重複資料,如果出現了,我們希望更新資料而不是重複儲存一次。我們需要實現:如果資料存在,就更新資料;如果資料不存在,則插入資料。
可以給插入語句新增約束條件:ON DUPLICATE KEY UPDATA
意思是如果主鍵已經存在,就執行更新操作。
完整的SQL寫法:INSERT INTO stundent(id,name,age) VALUES(%s,%s,%s) ON DUPLICATE KEY UPDATA id = %s,name = %s, age = %s
注意這裡%s是佔位符,可以通過execute第二個引數給他傳進去。這樣寫即可實現主鍵不存在便插入資料,主鍵存在則更新資料。
while迴圈 + fetchone
fetchall方法全部獲取資料,如果資料量很大,那麼佔用的開銷也會非常高
所以可以使用:
sql = 'SELECT * FROM students WHERE age >= 20'
try:
cursor.execute(sql)
print('count:',cursor.rowcount)
row = cursor.fetchone()
while row:
print('row:',row)
row = cursor.fetchone()
excpet:
print('error')