回顧一下已有的戰(zhàn)果:(1)連接數(shù)據(jù)庫;(2)建立指針;(3)通過指針插入記錄;(4)提交將插入結(jié)果保存到數(shù)據(jù)庫。在交互模式中,先溫故,再知新。
>>> #連接數(shù)據(jù)庫
>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",port=3036,charset="utf8")
>>> #建立指針
>>> cur = conn.cursor()
>>> #插入記錄
>>> cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("老齊","9988","1L
>>> #提交保存
>>> conn.commit()
剛才溫故的時(shí)候,插入的那條記錄也赫然在目。不過這里特別提醒看官,我在前面建立這個(gè)數(shù)據(jù)庫和數(shù)據(jù)表的時(shí)候,就已經(jīng)設(shè)定好了字符編碼為utf8,所以,在現(xiàn)在看到的查詢結(jié)果中,可以顯示漢字。否則,就看到的是一堆你不懂的碼子了。如果看官遇到,請不要慌張,只需要修改字符編碼即可。怎么改?請google。網(wǎng)上很多。
溫故結(jié)束,開始知新。
查詢數(shù)據(jù)
在前面操作的基礎(chǔ)上,如果要從數(shù)據(jù)庫中查詢數(shù)據(jù),當(dāng)然也可以用指針來操作了。
這說明從users表匯總查詢出來了7條記錄。但是,這似乎有點(diǎn)不友好,告訴我7條記錄查出來了,但是在哪里呢,看前面在'mysql>'下操作查詢命令的時(shí)候,一下就把7條記錄列出來了。怎么顯示python在這里的查詢結(jié)果呢?
原來,在指針實(shí)例中,還要用這樣的方法,才能實(shí)現(xiàn)上述想法:
fetchall(self):接收全部的返回結(jié)果行.
fetchmany(size=None):接收size條返回結(jié)果行.如果size的值大于返回的結(jié)果行的數(shù)量,則會(huì)返回cursor.arraysize條數(shù)據(jù).
fetchone():返回一條結(jié)果行.
scroll(value, mode='relative'):移動(dòng)指針到某一行.如果mode='relative',則表示從當(dāng)前所在行移動(dòng)value條,如果mode='absolute',則表示從結(jié)果集的第一行移動(dòng)value條.
按照這些規(guī)則,嘗試:
到這里,還沒有看到什么,其實(shí)已經(jīng)將查詢到的記錄(把他們看做對象)賦值給變量lines了。如果要把它們顯示出來,就要用到曾經(jīng)學(xué)習(xí)過的循環(huán)語句了。
只想查出第一條,可以嗎?當(dāng)然可以!看下面的:
為了對上述過程了解深入,做下面實(shí)驗(yàn):
原來,用cur.execute()從數(shù)據(jù)庫查詢出來的東西,被“保存在了cur所能找到的某個(gè)地方”,要找出這些被保存的東西,需要用cur.fetchall()(或者fechone等),并且找出來之后,做為對象存在。從上面的實(shí)驗(yàn)探討發(fā)現(xiàn),被保存的對象是一個(gè)tuple中,里面的每個(gè)元素,都是一個(gè)一個(gè)的tuple。因此,用for循環(huán)就可以一個(gè)一個(gè)拿出來了。
看官是否理解其內(nèi)涵了?
接著看,還有神奇的呢。
接著上面的操作,再打印一遍
暈了!怎么什么是空?不是說做為對象已經(jīng)存在了內(nèi)存中了嗎?難道這個(gè)內(nèi)存中的對象是一次有效嗎?
不要著急。
通過指針找出來的對象,在讀取的時(shí)候有一個(gè)特點(diǎn),就是那個(gè)指針會(huì)移動(dòng)。在第一次操作了print cur.fetchall()后,因?yàn)槭菍⑺械亩即蛴〕鰜?,指針就要從第一條移動(dòng)到最后一條。當(dāng)print結(jié)束之后,指針已經(jīng)在最后一條的后面了。接下來如果再次打印,就空了,最后一條后面沒有東西了。
下面還要實(shí)驗(yàn),檢驗(yàn)上面所說:
這次我不一次全部打印出來了,而是一次打印一條,看官可以從結(jié)果中看出來,果然那個(gè)指針在一條一條向下移動(dòng)呢。注意,我在這次實(shí)驗(yàn)中,是重新運(yùn)行了查詢語句。
那么,既然在操作存儲在內(nèi)存中的對象時(shí)候,指針會(huì)移動(dòng),能不能讓指針向上移動(dòng),或者移動(dòng)到指定位置呢?這就是那個(gè)scroll()
特別提醒看官注意的是,在python中,序列對象是的順序是從0開始的。
>>> cur.scroll(1,"absolute")
>>> print cur.fetchone()
(2L, u'python', u'123456', )
>>> cur.scroll(0,"absolute") #回到序號是0,即指向tuple的第一條
>>> print cur.fetchone()
(1L, u'qiwsir', u'123123', )
至此,已經(jīng)熟悉了cur.fetchall()和cur.fetchone()以及cur.scroll()幾個(gè)方法,還有另外一個(gè),接這上邊的操作,也就是指針在序號是1的位置,指向了tuple的第二條
上面這個(gè)操作,就是實(shí)現(xiàn)了從當(dāng)前位置(指針指向tuple的序號為1的位置,即第二條記錄)開始,含當(dāng)前位置,向下列出3條記錄。
讀取數(shù)據(jù),好像有點(diǎn)啰嗦呀。細(xì)細(xì)琢磨,還是有道理的。你覺得呢?
不過,python總是能夠?yàn)槲覀冎氲?,它的指針提供了一個(gè)參數(shù),可以實(shí)現(xiàn)將讀取到的數(shù)據(jù)變成字典形式,這樣就提供了另外一種讀取方式了。
這樣,在元組里面的元素就是一個(gè)一個(gè)字典??梢赃@樣來操作這個(gè)對象:
根據(jù)字典對象的特點(diǎn)來讀取了“鍵-值”。
更新數(shù)據(jù)
經(jīng)過前面的操作,這個(gè)就比較簡單了,不過需要提醒的是,如果更新完畢,和插入數(shù)據(jù)一樣,都需要commit()來提交保存。
從操作中看出來了,已經(jīng)將數(shù)據(jù)庫中第二條的用戶名修改為mypython了,用的就是update語句。
不過,要真的實(shí)現(xiàn)在數(shù)據(jù)庫中更新,還要運(yùn)行:
這就大事完吉了。