使用 Python 讀取資料庫有幾個方式分別為fetchone、fetchmany和fetchall這三種方式,剛開始寫Python對於這三者輸出及讀取的方是都有些不清楚,。
此篇就不特別敘述該如何建立資料庫連線,如果還不會的朋友可以參考另外一篇文章來建立資料庫連線。
資料庫中USER資料表
name | phone | country |
EVERLY | 0917426612 | TW |
AUTUMN | 0923473892 | KR |
ADRIAN | 0939584932 | AU |
ALEXANDER | 0928457923 | JP |
BROOKLYN | 0947539854 | ID |
OLIVER | 0993284039 | HK |
AUDREY | 0984579834 | NP |
WILLIAM | 0932847982 | FJ |
ARIANA | 0945380938 | KR |
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輸出的資料時要特別小心跟注意。