最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

跟老齊學(xué)Python之使用Python查詢更新數(shù)據(jù)庫

 更新時(shí)間:2014年11月25日 16:33:22   投稿:hebedich  
前面我們講述了使用python操作數(shù)據(jù)庫,今天我們來更進(jìn)一步,介紹下python查詢、更新數(shù)據(jù)庫的相關(guān)操作。有需要的小伙伴自己參考下吧。

回顧一下已有的戰(zhàn)果:(1)連接數(shù)據(jù)庫;(2)建立指針;(3)通過指針插入記錄;(4)提交將插入結(jié)果保存到數(shù)據(jù)庫。在交互模式中,先溫故,再知新。

復(fù)制代碼 代碼如下:

>>> #導(dǎo)入模塊
>>> import MySQLdb

>>> #連接數(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","qiwsir@gmail.com"))
1L

>>> #提交保存
>>> conn.commit()


如果看官跟我似的,有點(diǎn)強(qiáng)迫癥,總是想我得看到數(shù)據(jù)中有了,才放芳心呀。那就在進(jìn)入到數(shù)據(jù)庫,看看。

復(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í)候,插入的那條記錄也赫然在目。不過這里特別提醒看官,我在前面建立這個(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)然也可以用指針來操作了。

復(fù)制代碼 代碼如下:

>>> cur.execute("select * from users")   
7L

這說明從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ù)量,則會返回cursor.arraysize條數(shù)據(jù).
fetchone():返回一條結(jié)果行.
scroll(value, mode='relative'):移動指針到某一行.如果mode='relative',則表示從當(dāng)前所在行移動value條,如果mode='absolute',則表示從結(jié)果集的第一行移動value條.
按照這些規(guī)則,嘗試:

復(fù)制代碼 代碼如下:

>>> cur.execute("select * from users")   
7L
>>> lines = cur.fetchall()

到這里,還沒有看到什么,其實(shí)已經(jīng)將查詢到的記錄(把他們看做對象)賦值給變量lines了。如果要把它們顯示出來,就要用到曾經(jīng)學(xué)習(xí)過的循環(huán)語句了。

復(fù)制代碼 代碼如下:

>>> 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不能顯示罷了,不必驚慌,不必搭理它。

只想查出第一條,可以嗎?當(dāng)然可以!看下面的:

復(fù)制代碼 代碼如下:

>>> 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')

為了對上述過程了解深入,做下面實(shí)驗(yàn):

復(fù)制代碼 代碼如下:

>>> 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()從數(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)涵了?

接著看,還有神奇的呢。

接著上面的操作,再打印一遍

復(fù)制代碼 代碼如下:

>>> print cur.fetchall()
()

暈了!怎么什么是空?不是說做為對象已經(jīng)存在了內(nèi)存中了嗎?難道這個(gè)內(nèi)存中的對象是一次有效嗎?

不要著急。

通過指針找出來的對象,在讀取的時(shí)候有一個(gè)特點(diǎn),就是那個(gè)指針會移動。在第一次操作了print cur.fetchall()后,因?yàn)槭菍⑺械亩即蛴〕鰜?,指針就要從第一條移動到最后一條。當(dāng)print結(jié)束之后,指針已經(jīng)在最后一條的后面了。接下來如果再次打印,就空了,最后一條后面沒有東西了。

下面還要實(shí)驗(yàn),檢驗(yàn)上面所說:

復(fù)制代碼 代碼如下:

>>> 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')

這次我不一次全部打印出來了,而是一次打印一條,看官可以從結(jié)果中看出來,果然那個(gè)指針在一條一條向下移動呢。注意,我在這次實(shí)驗(yàn)中,是重新運(yùn)行了查詢語句。

那么,既然在操作存儲在內(nèi)存中的對象時(shí)候,指針會移動,能不能讓指針向上移動,或者移動到指定位置呢?這就是那個(gè)scroll()

復(fù)制代碼 代碼如下:

>>> 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')

果然,這個(gè)函數(shù)能夠移動指針,不過請仔細(xì)觀察,上面的方式是讓指針相對與當(dāng)前位置向上或者向下移動。即:

cur.scroll(n),或者,cur.scroll(n,"relative"):意思是相對當(dāng)前位置向上或者向下移動,n為正數(shù),表示向下(向前),n為負(fù)數(shù),表示向上(向后)

還有一種方式,可以實(shí)現(xiàn)“絕對”移動,不是“相對”移動:增加一個(gè)參數(shù)"absolute"

特別提醒看官注意的是,在python中,序列對象是的順序是從0開始的。

復(fù)制代碼 代碼如下:

>>> 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')

至此,已經(jīng)熟悉了cur.fetchall()和cur.fetchone()以及cur.scroll()幾個(gè)方法,還有另外一個(gè),接這上邊的操作,也就是指針在序號是1的位置,指向了tuple的第二條

復(fù)制代碼 代碼如下:

>>> 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'))

上面這個(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ù)變成字典形式,這樣就提供了另外一種讀取方式了。

復(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': 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'})   

這樣,在元組里面的元素就是一個(gè)一個(gè)字典??梢赃@樣來操作這個(gè)對象:

復(fù)制代碼 代碼如下:

>>> cur.scroll(0,"absolute")
>>> for line in cur.fetchall():
...     print line["username"]
...
qiwsir
mypython
google
facebook
github
docker
老齊

根據(jù)字典對象的特點(diǎn)來讀取了“鍵-值”。

更新數(shù)據(jù)

經(jīng)過前面的操作,這個(gè)就比較簡單了,不過需要提醒的是,如果更新完畢,和插入數(shù)據(jù)一樣,都需要commit()來提交保存。

復(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', u'python@gmail.com')

從操作中看出來了,已經(jīng)將數(shù)據(jù)庫中第二條的用戶名修改為mypython了,用的就是update語句。

不過,要真的實(shí)現(xiàn)在數(shù)據(jù)庫中更新,還要運(yùn)行:

復(fù)制代碼 代碼如下:

>>> conn.commit()

這就大事完吉了。

相關(guān)文章

  • Python如何使用k-means方法將列表中相似的句子歸類

    Python如何使用k-means方法將列表中相似的句子歸類

    這篇文章主要介紹了Python如何使用k-means方法將列表中相似的句子聚為一類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • keras 實(shí)現(xiàn)輕量級網(wǎng)絡(luò)ShuffleNet教程

    keras 實(shí)現(xiàn)輕量級網(wǎng)絡(luò)ShuffleNet教程

    這篇文章主要介紹了keras 實(shí)現(xiàn)輕量級網(wǎng)絡(luò)ShuffleNet教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python3中os.path模塊下常用的用法總結(jié)【推薦】

    python3中os.path模塊下常用的用法總結(jié)【推薦】

    這篇文章主要介紹了python3中os.path模塊下常用的用法總結(jié) ,需要的朋友可以參考下
    2018-09-09
  • Django中模板的繼承及引用實(shí)現(xiàn)

    Django中模板的繼承及引用實(shí)現(xiàn)

    Django模版引擎中最強(qiáng)大也是最復(fù)雜的部分就是模版繼承了,頁面的代碼很多,隨隨便便就是幾百行代碼,但是每個(gè)頁面之中都有相同的元素。本文主要介紹了Django模板的繼承及引用,感興趣的可以了解一下
    2021-08-08
  • Python3 pandas.concat的用法說明

    Python3 pandas.concat的用法說明

    這篇文章主要介紹了Python3 pandas.concat的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 利用python繪制蜂群圖的示例代碼

    利用python繪制蜂群圖的示例代碼

    蜂群圖可以不重疊的顯示各數(shù)據(jù)點(diǎn)的分布,相對于散點(diǎn)圖,所繪制的點(diǎn)彼此靠近且不會重疊,能有效呈現(xiàn)出點(diǎn)分布的局部密度信息,本文給大家介紹了如何利用python繪制蜂群圖,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • 從零開始的TensorFlow+VScode開發(fā)環(huán)境搭建的步驟(圖文)

    從零開始的TensorFlow+VScode開發(fā)環(huán)境搭建的步驟(圖文)

    這篇文章主要介紹了從零開始的TensorFlow+VScode開發(fā)環(huán)境搭建的步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python面向?qū)ο笾涌?、抽象類與多態(tài)詳解

    Python面向?qū)ο笾涌凇⒊橄箢惻c多態(tài)詳解

    這篇文章主要介紹了Python面向?qū)ο笾涌凇⒊橄箢惻c多態(tài),結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο笾薪涌?、抽象類及多態(tài)的概念、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • python ctypes庫2_指定參數(shù)類型和返回類型詳解

    python ctypes庫2_指定參數(shù)類型和返回類型詳解

    今天小編就為大家分享一篇python ctypes庫2_指定參數(shù)類型和返回類型詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能

    利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能

    這篇文章主要介紹了利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評論

宁城县| 镇宁| 龙海市| 栾城县| 普定县| 青冈县| 德昌县| 玉环县| 浦县| 新巴尔虎左旗| 双牌县| 屯留县| 松滋市| 遂昌县| 都安| 伊宁县| 横山县| 湖口县| 驻马店市| 二连浩特市| 汉沽区| 柘城县| 那曲县| 维西| 集安市| 旺苍县| 凌云县| 旌德县| 武功县| 三门峡市| 江华| 忻州市| 慈溪市| 东阳市| 苍梧县| 汨罗市| 乡宁县| 南皮县| 浮梁县| 永嘉县| 嘉善县|