1. 程式人生 > 其它 >MySQL儲存 pymysql模組

MySQL儲存 pymysql模組

目錄

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