成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[零基礎(chǔ)學(xué)python]用Python操作數(shù)據(jù)庫(2)

susheng / 3208人閱讀

摘要:那就在進(jìn)入到數(shù)據(jù)庫,看看。查詢數(shù)據(jù)在前面操作的基礎(chǔ)上,如果要從數(shù)據(jù)庫中查詢數(shù)據(jù),當(dāng)然也可以用指針來操作了。從操作中看出來了,已經(jīng)將數(shù)據(jù)庫中第二條的用戶名修改為了,用的就是語句。不過,要真的實現(xiàn)在數(shù)據(jù)庫中更新,還要運行這就大事完吉了。

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

>>> #導(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","[email protected]"))
1L

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

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

mysql> select * from users;
    +----+----------+----------+------------------+
    | id | username | password | email            |
    +----+----------+----------+------------------+
    |  1 | qiwsir   | 123123   | [email protected] |
    |  2 | python   | 123456   | [email protected] |
    |  3 | google   | 111222   | [email protected]      |
    |  4 | facebook | 222333   | [email protected]      |
    |  5 | github   | 333444   | [email protected]      |
    |  6 | docker   | 444555   | [email protected]      |
    |  7 | 老齊     | 9988     | [email protected] |
    +----+----------+----------+------------------+
    7 rows in set (0.00 sec)

剛才溫故的時候,插入的那條記錄也赫然在目。不過這里特別提醒看官,我在前面建立這個數(shù)據(jù)庫和數(shù)據(jù)表的時候,就已經(jīng)設(shè)定好了字符編碼為utf8,所以,在現(xiàn)在看到的查詢結(jié)果中,可以顯示漢字。否則,就看到的是一堆你不懂的碼子了。如果看官遇到,請不要慌張,只需要修改字符編碼即可。怎么改?請google。網(wǎng)上很多。

溫故結(jié)束,開始知新。

查詢數(shù)據(jù)

在前面操作的基礎(chǔ)上,如果要從數(shù)據(jù)庫中查詢數(shù)據(jù),當(dāng)然也可以用指針來操作了。

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

這說明從users表匯總查詢出來了7條記錄。但是,這似乎有點不友好,告訴我7條記錄查出來了,但是在哪里呢,看前面在"mysql>"下操作查詢命令的時候,一下就把7條記錄列出來了。怎么顯示python在這里的查詢結(jié)果呢?

原來,在指針實例中,還要用這樣的方法,才能實現(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ī)則,嘗試:

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

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

>>> for line in lines:
...     print line
... 
(1L, u"qiwsir", u"123123", u"[email protected]")
(2L, u"python", u"123456", u"[email protected]")
(3L, u"google", u"111222", u"[email protected]")
(4L, u"facebook", u"222333", u"[email protected]")
(5L, u"github", u"333444", u"[email protected]")
(6L, u"docker", u"444555", u"[email protected]")
(7L, u"u8001u9f50", u"9988", u"[email protected]")

很好。果然是逐條顯示出來了。列位注意,第七條中的u"u8001u95f5",這里是漢字,只不過由于我的shell不能顯示罷了,不必驚慌,不必搭理它。

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

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

為了對上述過程了解深入,做下面實驗:

>>> cur.execute("select * from users")
7L
>>> print cur.fetchall()
((1L, u"qiwsir", u"123123", u"[email protected]"), (2L, u"python", u"123456", u"[email protected]"), (3L, u"google", u"111222", u"[email protected]"), (4L, u"facebook", u"222333", u"[email protected]"), (5L, u"github", u"333444", u"[email protected]"), (6L, u"docker", u"444555", u"[email protected]"), (7L, u"u8001u9f50", u"9988", u"[email protected]"))

原來,用cur.execute()從數(shù)據(jù)庫查詢出來的東西,被“保存在了cur所能找到的某個地方”,要找出這些被保存的東西,需要用cur.fetchall()(或者fechone等),并且找出來之后,做為對象存在。從上面的實驗探討發(fā)現(xiàn),被保存的對象是一個tuple中,里面的每個元素,都是一個一個的tuple。因此,用for循環(huán)就可以一個一個拿出來了。

看官是否理解其內(nèi)涵了?

接著看,還有神奇的呢。

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

>>> print cur.fetchall()
()

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

不要著急。

通過指針找出來的對象,在讀取的時候有一個特點,就是那個指針會移動。在第一次操作了print cur.fetchall()后,因為是將所有的都打印出來,指針就要從第一條移動到最后一條。當(dāng)print結(jié)束之后,指針已經(jīng)在最后一條的后面了。接下來如果再次打印,就空了,最后一條后面沒有東西了。

下面還要實驗,檢驗上面所說:

>>> cur.execute("select * from users")
7L
>>> print cur.fetchone() 
(1L, u"qiwsir", u"123123", u"[email protected]")
>>> print cur.fetchone()
(2L, u"python", u"123456", u"[email protected]")
>>> print cur.fetchone()
(3L, u"google", u"111222", u"[email protected]")

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

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

>>> cur.scroll(1)
>>> print cur.fetchone()
(5L, u"github", u"333444", u"[email protected]")
>>> cur.scroll(-2)
>>> print cur.fetchone()
(4L, u"facebook", u"222333", u"[email protected]")

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

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

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

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

>>> cur.scroll(2,"absolute")    #回到序號是2,但指向第三條
>>> print cur.fetchone()        #打印,果然是
(3L, u"google", u"111222", u"[email protected]")

>>> cur.scroll(1,"absolute")
>>> print cur.fetchone()
(2L, u"python", u"123456", u"[email protected]")

>>> cur.scroll(0,"absolute")    #回到序號是0,即指向tuple的第一條
>>> print cur.fetchone()
(1L, u"qiwsir", u"123123", u"[email protected]")

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

>>> cur.fetchmany(3)
((2L, u"python", u"123456", u"[email protected]"), (3L, u"google", u"111222", u"[email protected]"), (4L, u"facebook", u"222333", u"[email protected]"))

上面這個操作,就是實現(xiàn)了從當(dāng)前位置(指針指向tuple的序號為1的位置,即第二條記錄)開始,含當(dāng)前位置,向下列出3條記錄。

讀取數(shù)據(jù),好像有點啰嗦呀。細(xì)細(xì)琢磨,還是有道理的。你覺得呢?

不過,python總是能夠為我們著想的,它的指針提供了一個參數(shù),可以實現(xiàn)將讀取到的數(shù)據(jù)變成字典形式,這樣就提供了另外一種讀取方式了。

>>> 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"[email protected]"}, {"username": u"mypython", "password": u"123456", "id": 2L, "email": u"[email protected]"}, {"username": u"google", "password": u"111222", "id": 3L, "email": u"[email protected]"}, {"username": u"facebook", "password": u"222333", "id": 4L, "email": u"[email protected]"}, {"username": u"github", "password": u"333444", "id": 5L, "email": u"[email protected]"}, {"username": u"docker", "password": u"444555", "id": 6L, "email": u"[email protected]"}, {"username": u"u8001u9f50", "password": u"9988", "id": 7L, "email": u"[email protected]"})     

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

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

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

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

經(jīng)過前面的操作,這個就比較簡單了,不過需要提醒的是,如果更新完畢,和插入數(shù)據(jù)一樣,都需要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"[email protected]")

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

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

>>> conn.commit()

這就大事完吉了。


在我的網(wǎng)站上,有完整的本教程目錄,邀請您光臨,并不吝賜教:www.itdiffer.com

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37429.html

相關(guān)文章

  • [基礎(chǔ)學(xué)python]Python操作數(shù)據(jù)庫(3)

    摘要:用選擇要操作的數(shù)據(jù)庫,然后通過指針就可以操作這個數(shù)據(jù)庫了。這樣就在這個數(shù)據(jù)庫中創(chuàng)建了一個名為的表這是查看表的方式。樹欲靜而風(fēng)不止,小偷在行動。所以,要特別提醒諸位注意。 通過python操作數(shù)據(jù)庫的行為,除了能夠完成前面兩講中的操作之外(當(dāng)然,那是比較常用的),其實任何對數(shù)據(jù)庫進(jìn)行的操作,都能夠通過python-mysqldb來實現(xiàn)。 建立數(shù)據(jù)庫 在《用python操作數(shù)據(jù)庫(1)...

    BDEEFE 評論0 收藏0
  • [基礎(chǔ)學(xué)python]有容乃大的list(1)

    摘要:定義在中,用方括號表示一個,在方括號里面,可以是,也可以是類型的數(shù)據(jù),甚至也能夠是這種布爾值。前面在對進(jìn)行操作的時候,有一些內(nèi)置函數(shù),比如,這是去掉左右空格的內(nèi)置函數(shù),也是的方法。 前面的學(xué)習(xí)中,我們已經(jīng)知道了兩種python的數(shù)據(jù)類型:int和str。再強調(diào)一下對數(shù)據(jù)類型的理解,這個世界是由數(shù)據(jù)組成的,數(shù)據(jù)可能是數(shù)字(注意,別搞混了,數(shù)字和數(shù)據(jù)是有區(qū)別的),也可能是文字、或者是聲音、...

    lewif 評論0 收藏0
  • [基礎(chǔ)學(xué)Python]正規(guī)地說一句話

    摘要:語句,遍列列表字符串字典集合等迭代器,依次處理迭代器中的每個元素。與配合使用處理在程序運行中出現(xiàn)的異常情況。表示此行為空,不運行任何操作。在迭代器函數(shù)內(nèi)使用,用于返回一個元素。恭請到上瀏覽及時更新的教程零基礎(chǔ)學(xué) 小孩子剛剛開始學(xué)說話的時候,常常是一個字一個字地開始學(xué),比如學(xué)說餃子,對他/她來講,似乎有點難度,大人也聰明,于是就簡化了,用餃餃來代替,其實就是讓孩子學(xué)會一個字就能表達(dá)。當(dāng)然...

    Freeman 評論0 收藏0
  • 基礎(chǔ)如何學(xué)爬蟲技術(shù)

    摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...

    KunMinX 評論0 收藏0
  • [基礎(chǔ)學(xué)Python]有點簡約的元組

    摘要:關(guān)于元組,上一講中涉及到了這個名詞。元組是用圓括號括起來的,其中的元素之間用逗號隔開。使用而不是如同擁有一個隱含的語句,說明這一數(shù)據(jù)是常量。必須是不可變的。只有字符串整數(shù)或其它對安全的才可以用作。 關(guān)于元組,上一講中涉及到了這個名詞。本講完整地講述它。 先看一個例子: >>>#變量引用str >>> s = abc >>> s abc >>>#如果這樣寫,就會是... >>> t...

    leap_frog 評論0 收藏0
  • [基礎(chǔ)學(xué)python]Python計算

    摘要:一提到計算機,當(dāng)然現(xiàn)在更多人把她叫做電腦,這兩個詞都是指。乃至于,有的人在口語中區(qū)分不開計算機和計算器。那么,做為零基礎(chǔ)學(xué)習(xí)這,也就從計算小學(xué)數(shù)學(xué)題目開始吧。因為從這里開始,數(shù)學(xué)的基礎(chǔ)知識列為肯定過關(guān)了。 一提到計算機,當(dāng)然現(xiàn)在更多人把她叫做電腦,這兩個詞都是指computer。不管什么,只要提到她,普遍都會想到她能夠比較快地做加減乘除,甚至乘方開方等。乃至于,有的人在口語中區(qū)分不開計...

    testbird 評論0 收藏0

發(fā)表評論

0條評論

susheng

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<