pymysql是python中操作mysql數(shù)據(jù)庫的一個(gè)優(yōu)秀的模塊烦租,使用起來也是非常的簡單和方便疾掰,只用記住幾個(gè)下面標(biāo)注紅色的部分的用法就ok了转晰。
從數(shù)據(jù)庫的增刪改查操作來學(xué)習(xí)pymysql:
import pymysql
# 導(dǎo)入模塊
conn = pymysql.connect(host='localhost',user='root',password='root',port=3306,database='stupy',charset='utf8')
上面的代碼是連接數(shù)據(jù)庫郭怪,眼熟就對了,基本都是一個(gè)套路广辰,有個(gè)地方需要說明下的是,后面的字符集主之,前幾天在抓某寶商品評論的時(shí)候就遇到一個(gè)問題择吊,評論內(nèi)容里面包含了emoji,用上面的代碼連接數(shù)據(jù)庫執(zhí)行入庫操作的時(shí)候報(bào)錯(cuò)了:
Incorrect string value: '\xF0\x9F\x98\x84'
一臉懵啊有沒有槽奕,查了下才發(fā)現(xiàn)是emoji表情的問題几睛,解決的方法也很簡單,將連接數(shù)據(jù)庫的字符集改成utf8mb4粤攒,且數(shù)據(jù)庫所森、表、字段都需要修改為utf8mb4字符集夯接,重要;兰谩!盔几!
發(fā)生這個(gè)錯(cuò)誤的原因是常見字符串占位3個(gè)字節(jié)晴弃,而emoji表情符號占用4個(gè)字節(jié),utf8就不好使了逊拍,所以就得用utf8mb4字符集上鞠。
下面來根據(jù)指定條件來查詢數(shù)據(jù)庫(數(shù)據(jù)表文件獲取口令0514):
with conn.cursor() as cursor:
# with代碼管理器,可以省掉cursor.close和conn.close
sql = 'select id,title,area1,huxing,price from fang where area1=%s'
cursor.execute(sql,['武昌'])
# 還有執(zhí)行多條sql和查詢條件參數(shù)的芯丧,在后面進(jìn)階偏中來寫
# rows = cursor.fetchall()
print('取一條:',cursor.fetchone())
print('獲取10條記錄:',cursor.fetchmany(10))
print('取一條:',cursor.fetchone())
# print(cursor.scroll(1, mode='absolute'))
# 指針按照絕對位置移動(dòng)1
# print(cursor.scroll(1, mode='relative'))
# 指針按照相對位置移動(dòng)1(相對當(dāng)前位置)
# 這個(gè)地方的fetchall()獲取所有記錄芍阎,還可以有fetchone獲取一條記錄的,返回記錄數(shù)
仔細(xì)測試下這里的三個(gè)獲取查詢結(jié)果的方法
fetchone:獲取一條記錄
fetchmany:獲取指定條數(shù)記錄
fetchall:獲取所有記錄
上面代碼中缨恒,打印出來的結(jié)果是按照代碼執(zhí)行順序來獲取數(shù)據(jù)的谴咸,就是說轮听,在調(diào)用fetchone的時(shí)候,指針會移動(dòng)到下個(gè)位置寿冕。
增加單條記錄:
with conn.cursor() as cursor:
sql1 = 'insert into spy(title,author,url,dt,ly) values(%s,%s,%s,%s,%s)'
# values里面有兩種寫法蕊程,一種是直接用%s占位符(沒有%d),一種是帶字段名%(name)s
row = cursor.execute(sql1,['test5','e','www.baidu.com','2019','loacl'])
# 批量插入多條數(shù)據(jù)驼唱,values用列表
conn.commit()
# 涉及修改數(shù)據(jù)庫操作的藻茂,需要用commit提交事務(wù)
print(row)
print(cursor.lastrowid)
增加多條記錄:
with conn.cursor() as cursor:
sql1 = 'insert into spy(title,author,url,dt,ly) values(%s,%s,%s,%s,%s)'
data = [
('test1','a','www.baidu.com','2019','loacl'),
('test2','b','www.baidu.com','2019','loacl'),
('test3','c','www.baidu.com','2019','loacl')
]
row = cursor.executemany(sql1,data)
# 批量插入多條數(shù)據(jù),values用列表
conn.commit()
# 涉及修改數(shù)據(jù)庫操作的玫恳,需要用commit提交事務(wù)
print(row)
單條記錄和多條記錄的區(qū)別主要一個(gè)是execute辨赐,一個(gè)是executemany
刪除操作:
with conn.cursor() as cursor:
sql1 = 'delete from spy where author=%s'
row = cursor.execute(sql1,['e'])
conn.commit()
print(row)
# 打印結(jié)果是影響的記錄數(shù)
修改操作:
with conn.cursor() as cursor:
sql1 = 'update spy set author=%s where ly=%s'
row = cursor.execute(sql1,['gary.w','loacl'])
conn.commit()
print(row)
# 打印結(jié)果是影響的記錄數(shù)
數(shù)據(jù)回滾:
cursor = conn.cursor()
sql1 = 'insert into spy(title,author,url,dt,ly) values(%s,%s,%s,%s,%s)'
sql2 = 'insert into spy(id,title,author,url,ly) values(%s,%s,%s,%s,%s)'
try:
cursor.execute(sql1,['test6','匿名','www.vxinhao.com','2019','loacl'])
cursor.execute(sql2,['這里應(yīng)該對應(yīng)的是int的id','錯(cuò)誤數(shù)據(jù)','www.baidu.com','2019','loacl'])
conn.commit()
except Exception as e:
print(str(e))
conn.rollback()
# 出現(xiàn)異常,執(zhí)行回滾
finally:
cursor.close()
conn.close()
# 執(zhí)行回滾后京办,數(shù)據(jù)不會被添加
這里做了個(gè)異常處理,看下異常處理的用法(模板):
try:
這里放執(zhí)行數(shù)據(jù)庫操作的代碼塊
except:
當(dāng)上面的代碼出現(xiàn)異常的時(shí)候執(zhí)行的代碼,這里用了rollback()方法
finally:
這里是一定會執(zhí)行的代碼,哪怕是前面出現(xiàn)錯(cuò)誤
只要sql語句不會有什么問題掀序,本文到這里,基本就夠用了(節(jié)約時(shí)間)