python數(shù)據(jù)庫(kù)操作指南之PyMysql使用詳解
PyMysql使用詳解
在編寫(xiě)小腳本時(shí),PyMysql是快速連接并操作數(shù)據(jù)庫(kù)的一個(gè)不錯(cuò)選擇。
安裝
pip3 install PyMysql # 可使用 pip list 查看此環(huán)境安裝了哪些第三方庫(kù) pip list | grep PyMysql
使用
import pymysql
連接數(shù)據(jù)庫(kù)
使用connect函數(shù)創(chuàng)建連接對(duì)象,此連接對(duì)象提供關(guān)閉數(shù)據(jù)庫(kù)、事務(wù)回滾等操作
一般傳參為:host, user, password, port(默認(rèn)為3306), database(想要連接的數(shù)據(jù)庫(kù)名)
db = pymysql.connect(host='127.0.0.1', user='root', password='pwd', database='database_name')
連接對(duì)象的常見(jiàn)方法:
方法名 | 說(shuō)明 |
---|---|
cursor() | 獲取游標(biāo)對(duì)象,操作數(shù)據(jù)庫(kù),如執(zhí)行DML操作,調(diào)用存儲(chǔ)過(guò)程等 |
commit() | 提交事務(wù) |
rollback() | 回滾事務(wù) |
close() | 關(guān)閉數(shù)據(jù)庫(kù)連接 |
操作數(shù)據(jù)庫(kù)
操作數(shù)據(jù)庫(kù)主要使用cursor游標(biāo)對(duì)象,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作
cursor游標(biāo)對(duì)象的常見(jiàn)方法
方法名 | 說(shuō)明 |
---|---|
close() | 關(guān)閉當(dāng)前游標(biāo)對(duì)象 |
execute(query) | 執(zhí)行數(shù)據(jù)庫(kù)操作,如sql語(yǔ)句或數(shù)據(jù)庫(kù)命令 |
executemany(query,params) | 用于批量操作,如:批量更新 |
fetchone() | 獲取查詢結(jié)果集中的下一條記錄 |
fetchmany(size) | 獲取查詢結(jié)果集中指定數(shù)量的記錄,size默認(rèn)為1 |
fetchall() | 獲取查詢結(jié)果集中所有記錄 |
nextset() | 跳至下一個(gè)可用的結(jié)果集 |
fetchone(),fetchmany(size),fetchall() 三者的返回值都是元組 或 元組的嵌套 查
查詢主要獲取結(jié)果集,注意fetchone 得到的是元組, fetchmany(size),fetchall()得到的是元組的嵌套
注意:
如果既要使用python的字符串解析%,sql語(yǔ)句中又包含sql的模糊查詢占位符%, 模糊查詢使用%%即可,這樣不會(huì)報(bào)錯(cuò)
import pymysql # 創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象 db = pymysql.connect(host='127.0.0.1', user='root', password='pwd', database='database_name') # 創(chuàng)建游標(biāo)對(duì)象 cursor = db.cursor() table_name = 'map_point' sql = "SELECT * FROM %s WHERE username LIKE 'DL%%' " % table_name try: cursor.execute(sql) # 執(zhí)行sql語(yǔ)句,也可執(zhí)行數(shù)據(jù)庫(kù)命令,如:show tables result = cursor.fetchall() # 所有結(jié)果 print(result) except Exception as e: db.rollback() print("查詢失敗") print(e) finally: cursor.close() # 關(guān)閉當(dāng)前游標(biāo) db.close() # 關(guān)閉數(shù)據(jù)庫(kù)連接
循環(huán)查詢:
在一些場(chǎng)景中,需要進(jìn)行循環(huán)查詢,判斷,此時(shí)在執(zhí)行完execute查詢語(yǔ)句后,務(wù)必進(jìn)行commit提交,否則每次查詢到的數(shù)據(jù)都是之前查詢結(jié)果的快照,也就是舊數(shù)據(jù)。
或者采用第二種方案,創(chuàng)建connect連接時(shí),增添autocommit=True屬性,自動(dòng)進(jìn)行commit提交。
增,刪,改
增刪改需要有提交事務(wù)的操作,查不需要提交事務(wù),但如果循環(huán)查詢,務(wù)必提交事務(wù),否則結(jié)果都是重復(fù)的
創(chuàng)建連接對(duì)象——db= pymysql()
創(chuàng)建cursor游標(biāo)對(duì)象——cur = db.cursor()
數(shù)據(jù)操作——cur.execute(sql)
提交連接事務(wù)——db.commit()
關(guān)閉cursor游標(biāo)對(duì)象——cur.close()
關(guān)閉連接對(duì)象——db.close( )
import pymysql # 創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象 db = pymysql.connect(host='127.0.0.1', user='root', password='pwd', database='database_name') # 創(chuàng)建游標(biāo)對(duì)象 cursor = db.cursor() table_name = 'table_name ' user_id = 'yyy' user_no = 'xxx' sql = "UPDATE %s SET user_no = '%s' WHERE user_id = '%s'" % (table_name, user_no, user_id) try: cursor.execute(sql) # 執(zhí)行sql語(yǔ)句,也可執(zhí)行數(shù)據(jù)庫(kù)命令,如:show tables db.commit() # 增刪改,必須執(zhí)行事務(wù) print("數(shù)據(jù)更新成功") except Exception as e: db.rollback() # 若出現(xiàn)失敗,進(jìn)行回滾 print("數(shù)據(jù)更新失敗") print(e) finally: cursor.close() # 關(guān)閉當(dāng)前游標(biāo) db.close() # 關(guān)閉數(shù)據(jù)庫(kù)連接
使用循環(huán)批量更新
db = pymysql.connect(host='127.0.0.1', user='root', password='pwd', database='database_name') table_name = 'table_name' update_list = ['xxx2', 'xxxx3'] condition_list = ['xxx', 'xxx1'] # 條件集合,更新集合長(zhǎng)度相等時(shí)可使用,可根據(jù)其他情況重新編寫(xiě) cursor = db.cursor() for i in range(len(condition_list)): sql = "UPDATE %s SET user_no = '%s' WHERE user_id = '%s'" % (table_name, update_list[i], condition_list[i]) print('執(zhí)行sql語(yǔ)句:' + sql) try: cursor.execute(sql) db.commit() print("數(shù)據(jù)更新成功" + str(i+1) + '條') except Exception as e: db.rollback() print("數(shù)據(jù)更新失敗") print(e) cursor.close() db.close()
使用executemany(query, param) 批量更新
params為每條記錄的維度,可為嵌套數(shù)組和元組
注意:sql語(yǔ)句中需要更改的數(shù)據(jù)不管什么類型,統(tǒng)一使用%s作為占位符,不需要加引號(hào)
# 創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象 db = pymysql.connect(host='127.0.0.1', user='root', password='pwd', database='database_name') # 創(chuàng)建游標(biāo)對(duì)象 cursor = db.cursor() update_list = ['a', 'b'] condition_list = ['a1', 'b1'] # 條件數(shù)組和需要更新的數(shù)據(jù)數(shù)組是分開(kāi)的,因?yàn)閜aram需要以每條的維度,所以可以使用拉鏈函數(shù)合并 params = zip(update_list, condition_list) # 或 param = [['a', 'a1'], ['b', 'b1']] sql = "UPDATE map_point SET storageLocation_no = %s WHERE position_id = %s" # 注意 這里的 占位%s 都不用加引號(hào) try: cursor.executemany(sql, params) # 執(zhí)行sql語(yǔ)句 db.commit() # 執(zhí)行事務(wù) print("數(shù)據(jù)批量更新成功") except Exception as e: db.rollback() print("數(shù)據(jù)更新失敗") print(e) finally: cursor.close() # 關(guān)閉當(dāng)前游標(biāo) db.close() # 關(guān)閉數(shù)據(jù)庫(kù)連接
總結(jié)
到此這篇關(guān)于python數(shù)據(jù)庫(kù)操作指南之PyMysql使用詳解的文章就介紹到這了,更多相關(guān)python數(shù)據(jù)庫(kù)操作PyMysql使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 讀取WAV音頻文件 畫(huà)頻譜的實(shí)例
這篇文章主要介紹了Python 讀取WAV音頻文件 畫(huà)頻譜的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03零基礎(chǔ)小白多久能學(xué)會(huì)python
在本篇文章里小編給大家分享的是一篇關(guān)于零基礎(chǔ)學(xué)python要多久的相關(guān)文章內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。2020-06-06Python使用Opencv打開(kāi)筆記本電腦攝像頭報(bào)錯(cuò)解問(wèn)題及解決
這篇文章主要介紹了Python使用Opencv打開(kāi)筆記本電腦攝像頭報(bào)錯(cuò)解問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06python算法與數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)代碼
鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。這篇文章主要介紹了python算法與數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)代碼,需要的朋友可以參考下2019-06-06python實(shí)現(xiàn)有效的括號(hào)判斷實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)有效的括號(hào)判斷的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01Springboo如何t動(dòng)態(tài)修改配置文件屬性
這篇文章主要介紹了Springboo如何t動(dòng)態(tài)修改配置文件屬性問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09關(guān)于Python3 類方法、靜態(tài)方法新解
今天小編就為大家分享一篇關(guān)于Python3 類方法、靜態(tài)方法新解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08