回顧一下已有的戰果:(1)鏈接數據庫;(2)創建指針;(3)經過指針插入記錄;(4)提交將插入結果保存到數據庫。在交互模式中,先溫故,再知新。python
>>> #導入模塊 >>> import MySQLdb >>> #鏈接數據庫 >>> 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","qiwsir@gmail.com")) 1L >>> #提交保存 >>> conn.commit()
若是看官跟我似的,有點強迫症,老是想我得看到數據中有了,才放芳心呀。那就在進入到數據庫,看看。mysql
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)
剛纔溫故的時候,插入的那條記錄也赫然在目。不過這裏特別提醒看官,我在前面創建這個數據庫和數據表的時候,就已經設定好了字符編碼爲utf8,因此,在如今看到的查詢結果中,能夠顯示漢字。不然,就看到的是一堆你不懂的碼子了。若是看官遇到,請不要慌張,只須要修改字符編碼便可。怎麼改?請google。網上不少。git
溫故結束,開始知新。github
在前面操做的基礎上,若是要從數據庫中查詢數據,固然也能夠用指針來操做了。sql
>>> cur.execute("select * from users") 7L
這說明從users表彙總查詢出來了7條記錄。可是,這彷佛有點不友好,告訴我7條記錄查出來了,可是在哪裏呢,看前面在'mysql>'下操做查詢命令的時候,一下就把7條記錄列出來了。怎麼顯示python在這裏的查詢結果呢?docker
原來,在指針實例中,還要用這樣的方法,才能實現上述想法:shell
按照這些規則,嘗試:數據庫
>>> cur.execute("select * from users") 7L >>> lines = cur.fetchall()
到這裏,尚未看到什麼,其實已經將查詢到的記錄(把他們看作對象)賦值給變量lines了。若是要把它們顯示出來,就要用到曾經學習過的循環語句了。函數
>>> for line in lines: ... print line ... (1L, u'qiwsir', u'123123', u'qiwsir@gmail.com') (2L, u'python', u'123456', u'python@gmail.com') (3L, u'google', u'111222', u'g@gmail.com') (4L, u'facebook', u'222333', u'f@face.book') (5L, u'github', u'333444', u'git@hub.com') (6L, u'docker', u'444555', u'doc@ker.com') (7L, u'\u8001\u9f50', u'9988', u'qiwsir@gmail.com')
很好。果真是逐條顯示出來了。列位注意,第七條中的u'\u8001\u95f5',這裏是漢字,只不過因爲個人shell不能顯示罷了,沒必要驚慌,沒必要搭理它。學習
只想查出第一條,能夠嗎?固然能夠!看下面的:
>>> cur.execute("select * from users where id=1") 1L >>> line_first = cur.fetchone() #只返回一條 >>> print line_first (1L, u'qiwsir', u'123123', u'qiwsir@gmail.com')
爲了對上述過程瞭解深刻,作下面實驗:
>>> cur.execute("select * from users") 7L >>> print cur.fetchall() ((1L, u'qiwsir', u'123123', u'qiwsir@gmail.com'), (2L, u'python', u'123456', u'python@gmail.com'), (3L, u'google', u'111222', u'g@gmail.com'), (4L, u'facebook', u'222333', u'f@face.book'), (5L, u'github', u'333444', u'git@hub.com'), (6L, u'docker', u'444555', u'doc@ker.com'), (7L, u'\u8001\u9f50', u'9988', u'qiwsir@gmail.com'))
原來,用cur.execute()從數據庫查詢出來的東西,被「保存在了cur所能找到的某個地方」,要找出這些被保存的東西,須要用cur.fetchall()(或者fechone等),而且找出來以後,作爲對象存在。從上面的實驗探討發現,被保存的對象是一個tuple中,裏面的每一個元素,都是一個一個的tuple。所以,用for循環就能夠一個一個拿出來了。
看官是否理解其內涵了?
接着看,還有神奇的呢。
接着上面的操做,再打印一遍
>>> print cur.fetchall() ()
暈了!怎麼什麼是空?不是說作爲對象已經存在了內存中了嗎?難道這個內存中的對象是一次有效嗎?
不要着急。
經過指針找出來的對象,在讀取的時候有一個特色,就是那個指針會移動。在第一次操做了print cur.fetchall()後,由於是將全部的都打印出來,指針就要從第一條移動到最後一條。當print結束以後,指針已經在最後一條的後面了。接下來若是再次打印,就空了,最後一條後面沒有東西了。
下面還要實驗,檢驗上面所說:
>>> cur.execute('select * from users') 7L >>> print cur.fetchone() (1L, u'qiwsir', u'123123', u'qiwsir@gmail.com') >>> print cur.fetchone() (2L, u'python', u'123456', u'python@gmail.com') >>> print cur.fetchone() (3L, u'google', u'111222', u'g@gmail.com')
此次我不一次所有打印出來了,而是一次打印一條,看官能夠從結果中看出來,果真那個指針在一條一條向下移動呢。注意,我在此次實驗中,是從新運行了查詢語句。
那麼,既然在操做存儲在內存中的對象時候,指針會移動,能不能讓指針向上移動,或者移動到指定位置呢?這就是那個scroll()
>>> cur.scroll(1) >>> print cur.fetchone() (5L, u'github', u'333444', u'git@hub.com') >>> cur.scroll(-2) >>> print cur.fetchone() (4L, u'facebook', u'222333', u'f@face.book')
果真,這個函數可以移動指針,不過請仔細觀察,上面的方式是讓指針相對與當前位置向上或者向下移動。即:
cur.scroll(n),或者,cur.scroll(n,"relative"):意思是相對當前位置向上或者向下移動,n爲正數,表示向下(向前),n爲負數,表示向上(向後)
還有一種方式,能夠實現「絕對」移動,不是「相對」移動:增長一個參數"absolute"
特別提醒看官注意的是,在python中,序列對象是的順序是從0開始的。
>>> cur.scroll(2,"absolute") #回到序號是2,但指向第三條 >>> print cur.fetchone() #打印,果真是 (3L, u'google', u'111222', u'g@gmail.com') >>> cur.scroll(1,"absolute") >>> print cur.fetchone() (2L, u'python', u'123456', u'python@gmail.com') >>> cur.scroll(0,"absolute") #回到序號是0,即指向tuple的第一條 >>> print cur.fetchone() (1L, u'qiwsir', u'123123', u'qiwsir@gmail.com')
至此,已經熟悉了cur.fetchall()和cur.fetchone()以及cur.scroll()幾個方法,還有另一個,接這上邊的操做,也就是指針在序號是1的位置,指向了tuple的第二條
>>> cur.fetchmany(3) ((2L, u'python', u'123456', u'python@gmail.com'), (3L, u'google', u'111222', u'g@gmail.com'), (4L, u'facebook', u'222333', u'f@face.book'))
上面這個操做,就是實現了從當前位置(指針指向tuple的序號爲1的位置,即第二條記錄)開始,含當前位置,向下列出3條記錄。
讀取數據,好像有點囉嗦呀。細細琢磨,仍是有道理的。你以爲呢?
不過,python老是可以爲咱們着想的,它的指針提供了一個參數,能夠實現將讀取到的數據變成字典形式,這樣就提供了另一種讀取方式了。
>>> cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) >>> cur.execute("select * from users") 7L >>> cur.fetchall() ({'username': u'qiwsir', 'password': u'123123', 'id': 1L, 'email': u'qiwsir@gmail.com'}, {'username': u'mypython', 'password': u'123456', 'id': 2L, 'email': u'python@gmail.com'}, {'username': u'google', 'password': u'111222', 'id': 3L, 'email': u'g@gmail.com'}, {'username': u'facebook', 'password': u'222333', 'id': 4L, 'email': u'f@face.book'}, {'username': u'github', 'password': u'333444', 'id': 5L, 'email': u'git@hub.com'}, {'username': u'docker', 'password': u'444555', 'id': 6L, 'email': u'doc@ker.com'}, {'username': u'\u8001\u9f50', 'password': u'9988', 'id': 7L, 'email': u'qiwsir@gmail.com'})
這樣,在元組裏面的元素就是一個一個字典。能夠這樣來操做這個對象:
>>> cur.scroll(0,"absolute") >>> for line in cur.fetchall(): ... print line["username"] ... qiwsir mypython google facebook github docker 老齊
根據字典對象的特色來讀取了「鍵-值」。
通過前面的操做,這個就比較簡單了,不過須要提醒的是,若是更新完畢,和插入數據同樣,都須要commit()來提交保存。
>>> 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', u'python@gmail.com')
從操做中看出來了,已經將數據庫中第二條的用戶名修改成mypython了,用的就是update語句。
不過,要真的實如今數據庫中更新,還要運行:
>>> conn.commit()
這就大事完吉了。