每次使用python獲取查詢結果的時候,都會糾結一段時間到底用fetchone和fetchall,用不好容易報錯,關鍵在于沒有搞清楚它們之間的區別和使用場景。
fetchone與fetchall區別
環境:python3中
fetchone
不管查詢結果是多條數據還是單條數據,使用fetchone得到的始終是一個元組。
如果查詢結果是單條數據:fetchone得到的單條數據的元組;
如果查詢結果是多條數據:fetchone默認是結果中的第一條數據構成的元組;
這就決定了如果需要取元組中的數值,需要使用cur.fetchone[0]
fetchall
不管查詢結果是多條數據還是單條數據,使用fetchall得到的始終是一個由元組組成的列表。
如果查詢結果是單條數據:fetchall得到的是由單個元組組成的列表,列表內是有單條數據組成的元組,即列表包含元組;
如果查詢結果是多條數據:fetchall得到的是由多個元組組成的列表;
這就決定了如果需要取元組中的數值,需要使用cur.fetchone[0][0]
使用場景
一般來說,查詢結果集是單條數據的,使用fetchone獲取數據
一般來說,查詢結果集是多條數據的,使用fetchall獲取數據
簡單實例
import cx_Oracle
conn = cx_Oracle.connect("用戶名/密碼@數據庫地址")
cur = conn.cursor()
sql_3 = "select id from CZEPT_BSDT t WHERE name='{}'".format("基本支出調劑")
cur.execute(sql_3)
result_3 = cur.fetchone() # 單條數據結果集
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() # 多條數據結果集
print(result_2) # [(1,'基本支出調劑'),(3,'銀行賬戶審批'),(5,'項目支出調劑')]
print(type(result_2)) # class 'list'>
result_2= result_2[0][0]
print(result_2) # 1
print(type(result_2)) # class 'int'>
注意事項
對于使用fetchone和fetchall獲取到的結果,最好使用之前先判斷非空,否則在存在空值的情況下獲取元組內的數據時,會報“超出索引”的異常。多次踩雷坑。
import cx_Oracle
connection = cx_Oracle.connect('用戶名/密碼@數據庫地址')
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()
# 因為存在歸口處室為空,所以切片的時候總是報超出索引范圍,搞了好久
if result is not None:
j['DIVISIONGUID'] = str(result[0])
補充:python DB.fetchall()--獲取數據庫所有記錄列表
查詢到的數據格式為列表:
多個元素的列表:

單個元素的列表:

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- python 操作mysql數據中fetchone()和fetchall()方式
- Python 操作mysql數據庫查詢之fetchone(), fetchmany(), fetchall()用法示例
- Python連接MySQL并使用fetchall()方法過濾特殊字符