python操作數(shù)據(jù)庫(kù)獲取結(jié)果之fetchone和fetchall的區(qū)別說(shuō)明
每次使用python獲取查詢結(jié)果的時(shí)候,都會(huì)糾結(jié)一段時(shí)間到底用fetchone和fetchall,用不好容易報(bào)錯(cuò),關(guān)鍵在于沒(méi)有搞清楚它們之間的區(qū)別和使用場(chǎng)景。
fetchone與fetchall區(qū)別
環(huán)境:python3中
fetchone
不管查詢結(jié)果是多條數(shù)據(jù)還是單條數(shù)據(jù),使用fetchone得到的始終是一個(gè)元組。
如果查詢結(jié)果是單條數(shù)據(jù):fetchone得到的單條數(shù)據(jù)的元組;
如果查詢結(jié)果是多條數(shù)據(jù):fetchone默認(rèn)是結(jié)果中的第一條數(shù)據(jù)構(gòu)成的元組;
這就決定了如果需要取元組中的數(shù)值,需要使用cur.fetchone[0]
fetchall
不管查詢結(jié)果是多條數(shù)據(jù)還是單條數(shù)據(jù),使用fetchall得到的始終是一個(gè)由元組組成的列表。
如果查詢結(jié)果是單條數(shù)據(jù):fetchall得到的是由單個(gè)元組組成的列表,列表內(nèi)是有單條數(shù)據(jù)組成的元組,即列表包含元組;
如果查詢結(jié)果是多條數(shù)據(jù):fetchall得到的是由多個(gè)元組組成的列表;
這就決定了如果需要取元組中的數(shù)值,需要使用cur.fetchone[0][0]
使用場(chǎng)景
一般來(lái)說(shuō),查詢結(jié)果集是單條數(shù)據(jù)的,使用fetchone獲取數(shù)據(jù)
一般來(lái)說(shuō),查詢結(jié)果集是多條數(shù)據(jù)的,使用fetchall獲取數(shù)據(jù)
簡(jiǎn)單實(shí)例
import cx_Oracle conn = cx_Oracle.connect("用戶名/密碼@數(shù)據(jù)庫(kù)地址") cur = conn.cursor() sql_3 = "select id from CZEPT_BSDT t WHERE name='{}'".format("基本支出調(diào)劑") cur.execute(sql_3) result_3 = cur.fetchone() # 單條數(shù)據(jù)結(jié)果集 print(result_3) # (1,) print(type(result_3)) # <class 'tuple'> result_3= result_3[0] print(result_3) # 1 print(type(result_3)) # <class 'int'> print("*" * 50) sql_2 = "select * from CZEPT_BSDT " cur.execute(sql_2) result_2 = cur.fetchall() # 多條數(shù)據(jù)結(jié)果集 print(result_2) # [(1,'基本支出調(diào)劑'),(3,'銀行賬戶審批'),(5,'項(xiàng)目支出調(diào)劑')] print(type(result_2)) # <class 'list'> result_2= result_2[0][0] print(result_2) # 1 print(type(result_2)) # <class 'int'>
注意事項(xiàng)
對(duì)于使用fetchone和fetchall獲取到的結(jié)果,最好使用之前先判斷非空,否則在存在空值的情況下獲取元組內(nèi)的數(shù)據(jù)時(shí),會(huì)報(bào)“超出索引”的異常。多次踩雷坑。
import cx_Oracle connection = cx_Oracle.connect('用戶名/密碼@數(shù)據(jù)庫(kù)地址') cur = connection.cursor() for j in data_list: sql = "select guid from jczl.division where name='{}'".format(j['DIVISIONNAME']) cur.execute(sql) result = cur.fetchone() # 因?yàn)榇嬖跉w口處室為空,所以切片的時(shí)候總是報(bào)超出索引范圍,搞了好久 if result is not None: j['DIVISIONGUID'] = str(result[0])
補(bǔ)充:python DB.fetchall()--獲取數(shù)據(jù)庫(kù)所有記錄列表
查詢到的數(shù)據(jù)格式為列表:
多個(gè)元素的列表:
單個(gè)元素的列表:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python實(shí)現(xiàn)抓取百度搜索結(jié)果頁(yè)的網(wǎng)站標(biāo)題信息
這篇文章主要介紹了Python實(shí)現(xiàn)抓取百度搜索結(jié)果頁(yè)的網(wǎng)站標(biāo)題信息,本文使用BeautifulSoup來(lái)解析HTML,需要的朋友可以參考下2015-01-01Python MNIST手寫(xiě)體識(shí)別詳解與試練
MNIST(官方網(wǎng)站)是非常有名的手寫(xiě)體數(shù)字識(shí)別數(shù)據(jù)集,在Tensorflow的官方網(wǎng)站里,第一個(gè)就拿它來(lái)做實(shí)戰(zhàn)講解,咱們也以此作為開(kāi)始的項(xiàng)目2021-11-11Python unittest如何生成HTMLTestRunner模塊
這篇文章主要介紹了Python unittest如何生成HTMLTestRunner模塊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Python使用GitPython操作Git版本庫(kù)的方法
這篇文章主要介紹了Python使用GitPython操作Git版本庫(kù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Python range函數(shù)之生成器函數(shù)的示例
這篇文章主要介紹了Python range函數(shù)之生成器函數(shù)的示例,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12