回顧一下已有的戰(zhàn)果:(1)連接數(shù)據(jù)庫(kù);(2)建立指針;(3)通過(guò)指針插入記錄;(4)提交將插入結(jié)果保存到數(shù)據(jù)庫(kù)。在交互模式中,先溫故,再知新。 復(fù)制代碼 代碼如下: >>> #導(dǎo)入模塊 >>> import MySQLdb >>> #連接數(shù)據(jù)庫(kù) >>> #建立指針 >>> #插入記錄 >>> #提交保存 如果看官跟我似的,有點(diǎn)強(qiáng)迫癥,總是想我得看到數(shù)據(jù)中有了,才放芳心呀。那就在進(jìn)入到數(shù)據(jù)庫(kù),看看。 復(fù)制代碼 代碼如下: mysql> select * from users; +----+----------+----------+------------------+ | id | username | password | email | +----+----------+----------+------------------+ | 1 | qiwsir | 123123 | qiwsir@gmail.com | | 2 | python | 123456 | python@gmail.com | | 3 | google | 111222 | g@gmail.com | | 4 | facebook | 222333 | f@face.book | | 5 | github | 333444 | git@hub.com | | 6 | docker | 444555 | doc@ker.com | | 7 | 老齊 | 9988 | qiwsir@gmail.com | +----+----------+----------+------------------+ 7 rows in set (0.00 sec) 剛才溫故的時(shí)候,插入的那條記錄也赫然在目。不過(guò)這里特別提醒看官,我在前面建立這個(gè)數(shù)據(jù)庫(kù)和數(shù)據(jù)表的時(shí)候,就已經(jīng)設(shè)定好了字符編碼為utf8,所以,在現(xiàn)在看到的查詢(xún)結(jié)果中,可以顯示漢字。否則,就看到的是一堆你不懂的碼子了。如果看官遇到,請(qǐng)不要慌張,只需要修改字符編碼即可。怎么改?請(qǐng)google。網(wǎng)上很多。 溫故結(jié)束,開(kāi)始知新。 查詢(xún)數(shù)據(jù) 在前面操作的基礎(chǔ)上,如果要從數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù),當(dāng)然也可以用指針來(lái)操作了。 復(fù)制代碼 代碼如下: >>> cur.execute("select * from users") 7L 這說(shuō)明從users表匯總查詢(xún)出來(lái)了7條記錄。但是,這似乎有點(diǎn)不友好,告訴我7條記錄查出來(lái)了,但是在哪里呢,看前面在'mysql>'下操作查詢(xún)命令的時(shí)候,一下就把7條記錄列出來(lái)了。怎么顯示python在這里的查詢(xún)結(jié)果呢? 原來(lái),在指針實(shí)例中,還要用這樣的方法,才能實(shí)現(xiàn)上述想法: fetchall(self):接收全部的返回結(jié)果行. 復(fù)制代碼 代碼如下: >>> cur.execute("select * from users") 7L >>> lines = cur.fetchall() 到這里,還沒(méi)有看到什么,其實(shí)已經(jīng)將查詢(xún)到的記錄(把他們看做對(duì)象)賦值給變量lines了。如果要把它們顯示出來(lái),就要用到曾經(jīng)學(xué)習(xí)過(guò)的循環(huán)語(yǔ)句了。 復(fù)制代碼 代碼如下: >>> for line in lines: ... print line ... (1L, u'qiwsir', u'123123', ) (2L, u'python', u'123456', ) (3L, u'google', u'111222', ) (4L, u'facebook', u'222333', ) (5L, u'github', u'333444', ) (6L, u'docker', u'444555', ) (7L, u'\u8001\u9f50', u'9988', ) 很好。果然是逐條顯示出來(lái)了。列位注意,第七條中的u'\u8001\u95f5',這里是漢字,只不過(guò)由于我的shell不能顯示罷了,不必驚慌,不必搭理它。 只想查出第一條,可以嗎?當(dāng)然可以!看下面的: 復(fù)制代碼 代碼如下: >>> cur.execute("select * from users where id=1") 1L >>> line_first = cur.fetchone() #只返回一條 >>> print line_first (1L, u'qiwsir', u'123123', ) 為了對(duì)上述過(guò)程了解深入,做下面實(shí)驗(yàn): 復(fù)制代碼 代碼如下: >>> cur.execute("select * from users") 7L >>> print cur.fetchall() ((1L, u'qiwsir', u'123123', ), (2L, u'python', u'123456', ), (3L, u'google', u'111222', ), (4L, u'facebook', u'222333', ), (5L, u'github', u'333444', ), (6L, u'docker', u'444555', ), (7L, u'\u8001\u9f50', u'9988', )) 原來(lái),用cur.execute()從數(shù)據(jù)庫(kù)查詢(xún)出來(lái)的東西,被“保存在了cur所能找到的某個(gè)地方”,要找出這些被保存的東西,需要用cur.fetchall()(或者fechone等),并且找出來(lái)之后,做為對(duì)象存在。從上面的實(shí)驗(yàn)探討發(fā)現(xiàn),被保存的對(duì)象是一個(gè)tuple中,里面的每個(gè)元素,都是一個(gè)一個(gè)的tuple。因此,用for循環(huán)就可以一個(gè)一個(gè)拿出來(lái)了。 看官是否理解其內(nèi)涵了? 接著看,還有神奇的呢。 接著上面的操作,再打印一遍 復(fù)制代碼 代碼如下: >>> print cur.fetchall() () 暈了!怎么什么是空?不是說(shuō)做為對(duì)象已經(jīng)存在了內(nèi)存中了嗎?難道這個(gè)內(nèi)存中的對(duì)象是一次有效嗎? 不要著急。 通過(guò)指針找出來(lái)的對(duì)象,在讀取的時(shí)候有一個(gè)特點(diǎn),就是那個(gè)指針會(huì)移動(dòng)。在第一次操作了print cur.fetchall()后,因?yàn)槭菍⑺械亩即蛴〕鰜?lái),指針就要從第一條移動(dòng)到最后一條。當(dāng)print結(jié)束之后,指針已經(jīng)在最后一條的后面了。接下來(lái)如果再次打印,就空了,最后一條后面沒(méi)有東西了。 下面還要實(shí)驗(yàn),檢驗(yàn)上面所說(shuō): 復(fù)制代碼 代碼如下: >>> cur.execute('select * from users') 7L >>> print cur.fetchone() (1L, u'qiwsir', u'123123', ) >>> print cur.fetchone() (2L, u'python', u'123456', ) >>> print cur.fetchone() (3L, u'google', u'111222', ) 這次我不一次全部打印出來(lái)了,而是一次打印一條,看官可以從結(jié)果中看出來(lái),果然那個(gè)指針在一條一條向下移動(dòng)呢。注意,我在這次實(shí)驗(yàn)中,是重新運(yùn)行了查詢(xún)語(yǔ)句。 那么,既然在操作存儲(chǔ)在內(nèi)存中的對(duì)象時(shí)候,指針會(huì)移動(dòng),能不能讓指針向上移動(dòng),或者移動(dòng)到指定位置呢?這就是那個(gè)scroll() 復(fù)制代碼 代碼如下: >>> cur.scroll(1) >>> print cur.fetchone() (5L, u'github', u'333444', ) >>> cur.scroll(-2) >>> print cur.fetchone() (4L, u'facebook', u'222333', ) 果然,這個(gè)函數(shù)能夠移動(dòng)指針,不過(guò)請(qǐng)仔細(xì)觀察,上面的方式是讓指針相對(duì)與當(dāng)前位置向上或者向下移動(dòng)。即: cur.scroll(n),或者,cur.scroll(n,"relative"):意思是相對(duì)當(dāng)前位置向上或者向下移動(dòng),n為正數(shù),表示向下(向前),n為負(fù)數(shù),表示向上(向后) 還有一種方式,可以實(shí)現(xiàn)“絕對(duì)”移動(dòng),不是“相對(duì)”移動(dòng):增加一個(gè)參數(shù)"absolute" 特別提醒看官注意的是,在python中,序列對(duì)象是的順序是從0開(kāi)始的。 復(fù)制代碼 代碼如下: >>> cur.scroll(2,"absolute") #回到序號(hào)是2,但指向第三條 >>> print cur.fetchone() #打印,果然是 (3L, u'google', u'111222', ) >>> cur.scroll(1,"absolute") >>> cur.scroll(0,"absolute") #回到序號(hào)是0,即指向tuple的第一條 至此,已經(jīng)熟悉了cur.fetchall()和cur.fetchone()以及cur.scroll()幾個(gè)方法,還有另外一個(gè),接這上邊的操作,也就是指針在序號(hào)是1的位置,指向了tuple的第二條 復(fù)制代碼 代碼如下: >>> cur.fetchmany(3) ((2L, u'python', u'123456', ), (3L, u'google', u'111222', ), (4L, u'facebook', u'222333', )) 上面這個(gè)操作,就是實(shí)現(xiàn)了從當(dāng)前位置(指針指向tuple的序號(hào)為1的位置,即第二條記錄)開(kāi)始,含當(dāng)前位置,向下列出3條記錄。 讀取數(shù)據(jù),好像有點(diǎn)啰嗦呀。細(xì)細(xì)琢磨,還是有道理的。你覺(jué)得呢? 不過(guò),python總是能夠?yàn)槲覀冎氲?,它的指針提供了一個(gè)參數(shù),可以實(shí)現(xiàn)將讀取到的數(shù)據(jù)變成字典形式,這樣就提供了另外一種讀取方式了。 復(fù)制代碼 代碼如下: >>> cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) >>> cur.execute("select * from users") 7L >>> cur.fetchall() ({'username': u'qiwsir', 'password': u'123123', 'id': 1L, 'email': }, {'username': u'mypython', 'password': u'123456', 'id': 2L, 'email': }, {'username': u'google', 'password': u'111222', 'id': 3L, 'email': }, {'username': u'facebook', 'password': u'222333', 'id': 4L, 'email': }, {'username': u'github', 'password': u'333444', 'id': 5L, 'email': }, {'username': u'docker', 'password': u'444555', 'id': 6L, 'email': }, {'username': u'\u8001\u9f50', 'password': u'9988', 'id': 7L, 'email': }) 這樣,在元組里面的元素就是一個(gè)一個(gè)字典。可以這樣來(lái)操作這個(gè)對(duì)象: 復(fù)制代碼 代碼如下: >>> cur.scroll(0,"absolute") >>> for line in cur.fetchall(): ... print line["username"] ... qiwsir mypython github docker 老齊 根據(jù)字典對(duì)象的特點(diǎn)來(lái)讀取了“鍵-值”。 更新數(shù)據(jù) 經(jīng)過(guò)前面的操作,這個(gè)就比較簡(jiǎn)單了,不過(guò)需要提醒的是,如果更新完畢,和插入數(shù)據(jù)一樣,都需要commit()來(lái)提交保存。 復(fù)制代碼 代碼如下: >>> cur.execute("update users set username=%s where id=2",("mypython")) 1L >>> cur.execute("select * from users where id=2") 1L >>> cur.fetchone() (2L, u'mypython', u'123456', ) 從操作中看出來(lái)了,已經(jīng)將數(shù)據(jù)庫(kù)中第二條的用戶(hù)名修改為mypython了,用的就是update語(yǔ)句。 不過(guò),要真的實(shí)現(xiàn)在數(shù)據(jù)庫(kù)中更新,還要運(yùn)行: 復(fù)制代碼 代碼如下: >>> conn.commit() 這就大事完吉了。 |
|