Python 讀取資料庫使用fetchone、fetchmany及fetchall的差異

使用 Python 讀取資料庫有幾個方式分別為fetchone、fetchmany和fetchall這三種方式,剛開始寫Python對於這三者輸出及讀取的方是都有些不清楚,。

此篇就不特別敘述該如何建立資料庫連線,如果還不會的朋友可以參考另外一篇文章來建立資料庫連線。

資料庫中USER資料表

namephonecountry
EVERLY0917426612TW
AUTUMN0923473892KR
ADRIAN0939584932AU
ALEXANDER0928457923JP
BROOKLYN0947539854ID
OLIVER0993284039HK
AUDREY0984579834NP
WILLIAM0932847982FJ
ARIANA0945380938KR

fetchone()讀取資料庫一行

查詢資料庫時輸出單個記錄,執行多次可以不斷的輸出下一筆,當沒有資料可以輸出則輸出 None。

import sqlite3

connection = sqlite3.connect('SQLite_Python.db')
cur = connection.cursor()

cur.execute("select name,phone from user")
records = cur.fetchone()
print("一次印出全部內容 : ", records)
print("一次印出第一個元素 : ", records[0])
print("一次印出第二個元素 : ", records[1])

cur.close()
$ python3.exe .\Test.py
一次印出全部內容 :  ('EVERLY', 917426612)
一次印出第一個元素 :  EVERLY
一次印出第二個元素 :  917426612

fetchmany()

查詢參數指定的行數當重複執行時,此方法會自動查詢下一組資料結果並以列表方式輸出。
如果沒有更多資料或已經查詢到底無下一組可以查詢時,則輸出一個空列表。

import sqlite3

connection = sqlite3.connect('SQLite_Python.db')
cur = connection.cursor()

cur.execute("select name,phone from user")
for records in cur.fetchmany(2):
    print("一次印出全部內容 : ", records)
    print("一次印出第一個元素 : ", records[0])
    print("一次印出第二個元素 : ", records[1])

cur.close()
$ python3.exe .\Test.py
一次印出全部內容 :  ('EVERLY', 917426612)
一次印出第一個元素 :  EVERLY
一次印出第二個元素 :  917426612
一次印出全部內容 :  ('AUTUMN', 923473892)
一次印出第一個元素 :  AUTUMN
一次印出第二個元素 :  923473892

重複執行 fetchmany

當重複執行 fetchmany 會自動擷取下一組資料,將程式碼複製成兩段重複執行兩次。

import sqlite3

connection = sqlite3.connect('SQLite_Python.db')
cur = connection.cursor()
print("第一次執行")
cur.execute("select name,phone from user")
for records in cur.fetchmany(2):
    print("一次印出全部內容 : ", records)
    print("一次印出第一個元素 : ", records[0])
    print("一次印出第二個元素 : ", records[1])

print("第二次執行")

for records in cur.fetchmany(2):
    print("一次印出全部內容 : ", records)
    print("一次印出第一個元素 : ", records[0])
    print("一次印出第二個元素 : ", records[1])

cur.close()

執行程式碼後,第一次查詢輸出了兩筆資料,再次執行後輸出下兩筆的資料。

$ python3.exe .\Test.py
第一次執行
一次印出全部內容 :  ('EVERLY', 917426612)
一次印出第一個元素 :  EVERLY
一次印出第二個元素 :  917426612
一次印出全部內容 :  ('AUTUMN', 923473892)
一次印出第一個元素 :  AUTUMN
一次印出第二個元素 :  923473892
第二次執行
一次印出全部內容 :  ('ADRIAN', 939584932)
一次印出第一個元素 :  ADRIAN
一次印出第二個元素 :  939584932
一次印出全部內容 :  ('ALEXANDER', 928457923)
一次印出第一個元素 :  ALEXANDER
一次印出第二個元素 :  928457923

fetchall()

獲取查詢結果的所有資料。它將所有資料輸出列表形式。
當沒有獲取到任何資料時,則輸出一個空列表。

import sqlite3

connection = sqlite3.connect('SQLite_Python.db')
cur = connection.cursor()

cur.execute("select name,phone from user")
for records in cur.fetchall():
    print("一次印出全部內容 : ", records)
    print("一次印出第一個元素 : ", records[0])
    print("一次印出第二個元素 : ", records[1])

cur.close()
$ python3.exe .\Test.py
一次印出全部內容 :  ('EVERLY', 917426612)
一次印出第一個元素 :  EVERLY
一次印出第二個元素 :  917426612
一次印出全部內容 :  ('AUTUMN', 923473892)
一次印出第一個元素 :  AUTUMN
一次印出第二個元素 :  923473892
一次印出全部內容 :  ('ADRIAN', 939584932)
一次印出第一個元素 :  ADRIAN
一次印出第二個元素 :  939584932
---------------------------------節省顯示-----資料刪除記號---------------------------------------
一次印出全部內容 :  ('ARIANA', 945380938)
一次印出第一個元素 :  ARIANA
一次印出第二個元素 :  945380938

list 讀取方式

最後一招不使用任何fetch來讀取資料,直接用列表的概念來讀取資料內容。

import sqlite3

connection = sqlite3.connect('SQLite_Python.db')
cur = connection.cursor()

cur.execute("select name,phone from user")
for records in cur:
    print("一次印出全部內容 : ", records)
    print("一次印出第一個元素 : ", records[0])
    print("一次印出第二個元素 : ", records[1])

cur.close()

此方式最後輸出結果會跟fetchall一樣,但此方法的好處是直接提取資料庫回應中的元素。

故不用先把資料放入記憶體中再進行處理,記憶體資源耗費就會少一點,使用此方式是不會占用大量記憶體。

$ python3.exe .\Test.py
一次印出全部內容 :  ('EVERLY', 917426612)
一次印出第一個元素 :  EVERLY
一次印出第二個元素 :  917426612
一次印出全部內容 :  ('AUTUMN', 923473892)
一次印出第一個元素 :  AUTUMN
一次印出第二個元素 :  923473892
一次印出全部內容 :  ('ADRIAN', 939584932)
一次印出第一個元素 :  ADRIAN
一次印出第二個元素 :  939584932
---------------------------------節省顯示-----資料刪除記號---------------------------------------
一次印出全部內容 :  ('ARIANA', 945380938)
一次印出第一個元素 :  ARIANA
一次印出第二個元素 :  945380938

注意陷阱部分

當查詢結果有多筆資料:

fetchone():將只讀取最後面的一條結果,並以一維陣列方式輸出資料,例如(‘id’,’name’)

fetchall() :將會輸出所有結果,並以二維陣列方式輸出,例如 ((‘id’,’name’),(‘id’,’name’))

當查詢只有一筆資料時:

fetchone():一樣只輸出一筆結果,並以一維陣列方式輸出資料,例如(‘id’,’name’)

fetchall() :也會返回所有結果,並以二維陣列方式輸出,例如 ((‘id’,’name’))

故在整理SQL輸出的資料時要特別小心跟注意。

參考來源:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端