1. 程式人生 > >Python 操作 MySQL 的一點兒補充

Python 操作 MySQL 的一點兒補充

寫在之前

在前面的文章中我寫了關於 Python 操作 MySQL 資料庫的文章(如下):

Python 操作 MySQL 資料庫

主要講了如何簡單的使用 MySQL 以及如何用 Python 來操作 MySQL 資料庫,基本的操作資料庫無非就是增刪改查這幾個方面,Python 操作資料庫的基本操作也是這幾個。

因為內容較多,所以昨天的文章中在「查詢」那部分有幾個知識點沒有寫,後來想了想覺的這幾個點也比較重要,本著寫就寫到底的“精神”,所以今天把它們單獨拿出來寫一下。往下看之前,建議先去看看昨天的文章。

Python 操作 MySQL 之查詢

我在昨天的文章中說過,Python 是通過遊標執行 SQL 語句的,所以我們在建立連線以後,要利用連線物件得到遊標物件,然後利用遊標物件的方法對資料庫進行操作,在這裡我補充一下游標物件的常用方法:

在這裡插入圖片描述

下面我還是用昨天文章中的例子:

我們從資料庫中查詢資料,使用遊標的方法 execute() 來操作:

>>> cur.execute("select * from users")
2

這說明從 users 表彙總查詢出 2 條記錄,但是這 2 條記錄並沒有顯示出來,那麼如何顯示 Python 查詢結果呢?這就需要用到遊標物件的 fetchall()、fetchmany(size=None)、fetchone() 等方法:

>>> lines = cur.fetchall()
>>> for line in lines:
...     print(line)
...
(1, 'rocky', '123123', '
[email protected]
') (2, 'mypython', '123123', '[email protected]')

這樣就逐條顯示出來了。如果我們只想查其中某一條的話,也是可以的。比如第 1 條:

>>> cur.execute("select * from users where id = 1")
1
>>> line_first = cur.fetchone() #只返回一條
>>> print(line_first)
(1, 'rocky', '123123', '[email protected]
')

為了對上述過程深入瞭解,我們下面來做一個小的實驗:

>>> cur.execute("select * from users")
2
>>> cur.fetchall()
((1, 'rocky', '123123', '[email protected]'), (2, 'mypython', '123123', '[email protected]'))

由 cur.execute() 從資料庫查詢出來的東西,被儲存在了 cur 所能找到的某個地方。要找出這些被儲存的東西,需要用 cur.fetchall()(或 fetchone() 等),並且找出來以後作為物件存在。從上述程式碼及其執行結果來看,返回值是一個元組物件,裡面的每一個物件都是一個一個的元組。所以我們用 for 迴圈就可以一個一個的拿出來。

我們緊接著上面的操作,再列印一遍:

>>> cur.fetchall()
()

咦,竟然是空的,怎麼回事?不是說作為物件已經存在於記憶體中了嗎?難道只是一次有效的嗎?不要著急,還記得檔案那部分嗎?我們在那也遇到過這樣的問題呀。(忘了的回去再翻翻)

通過遊標找出來的物件,在讀取的時候有一個特點:就是那個遊標會移動。在第一次操作了 cur.fetchall() 後,因為是將所有的都打印出來了,遊標就從第一條移動到了最後一條,所以再執行 cur.fetchall() 的時候就空了,因為最後一條後面沒東西了。有沒有想起來,是不是和檔案一個樣。

我們下面繼續來試驗,檢驗一下上面說的正確與否:

>>> cur.fetchone()
(1, 'rocky', '123123', '[email protected]')
>>> cur.fetchone()
(2, 'mypython', '123123', '[email protected]')
>>> cur.fetchone()
>>>

你看,我們重新運行了查詢語句後,這次我們不再一次性全部打印出來,而是一次列印一條。從上面的結果中我們可以看到,遊標果然是在一條一條的向下移動。

到這可能有人會想,既然操作儲存在記憶體中的物件時遊標會移動,那麼能不能讓遊標向上移動?或者移動到指定的地方呢?可以的,這就是 scroll()。

>>> cur.scroll(1)
>>> cur.fetchone()
(2, 'mypython', '123123', '[email protected]')
>>> cur.scroll(-2)
>>> cur.fetchone()
(1, 'rocky', '123123', '[email protected]')

果然是可以移動遊標的,不過請仔細觀察,上面的方式是讓遊標相對於當前位置向上或者向下移動,括號內是正數表示向下,括號內是負數,表示向上。

其實還有一種方式可以實現「絕對移動」,而不是「相對」某位置移動,即增加一個引數 absolute。「絕對移動」的參照物是開始,即位置編號為 0 的第 1 條:

>>> cur.scroll(1,"absolute") # 回到第 2 條
>>> cur.fetchone()
(2, 'mypython', '123123', '[email protected]')
>>> cur.scroll(0,"absolute")
>>> cur.fetchone()
(1, 'rocky', '123123', '[email protected]')

這裡需要注意的是絕對位置中的數字不能是負數。

寫在之後

這個部分我用了很大的篇幅來寫,雖然看到的只是 2 篇文章,但是基本上每篇都很長,本來想拆分一下再寫的,後來還是決定就是這麼寫完,想看的人自然會看。

更多內容,歡迎關注公眾號「Python空間」,期待和你的交流。
在這裡插入圖片描述