摘要:那就在進入到數據庫,看看。查詢數據在前面操作的基礎上,如果要從數據庫中查詢數據,當然也可以用指針來操作了。從操作中看出來了,已經將數據庫中第二條的用戶名修改為了,用的就是語句。不過,要真的實現在數據庫中更新,還要運行這就大事完吉了。
回顧一下已有的戰果:(1)連接數據庫;(2)建立指針;(3)通過指針插入記錄;(4)提交將插入結果保存到數據庫。在交互模式中,先溫故,再知新。
>>> #導入模塊 >>> 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> 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。網上很多。
溫故結束,開始知新。
查詢數據在前面操作的基礎上,如果要從數據庫中查詢數據,當然也可以用指針來操作了。
>>> cur.execute("select * from users") 7L
這說明從users表匯總查詢出來了7條記錄。但是,這似乎有點不友好,告訴我7條記錄查出來了,但是在哪里呢,看前面在"mysql>"下操作查詢命令的時候,一下就把7條記錄列出來了。怎么顯示python在這里的查詢結果呢?
原來,在指針實例中,還要用這樣的方法,才能實現上述想法:
fetchall(self):接收全部的返回結果行.
fetchmany(size=None):接收size條返回結果行.如果size的值大于返回的結果行的數量,則會返回cursor.arraysize條數據.
fetchone():返回一條結果行.
scroll(value, mode="relative"):移動指針到某一行.如果mode="relative",則表示從當前所在行移動value條,如果mode="absolute",則表示從結果集的第一行移動value條.
按照這些規則,嘗試:
>>> 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"u8001u9f50", u"9988", u"qiwsir@gmail.com")
很好。果然是逐條顯示出來了。列位注意,第七條中的u"u8001u95f5",這里是漢字,只不過由于我的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"u8001u9f50", 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"u8001u9f50", "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()
這就大事完吉了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37429.html
摘要:用選擇要操作的數據庫,然后通過指針就可以操作這個數據庫了。這樣就在這個數據庫中創建了一個名為的表這是查看表的方式。樹欲靜而風不止,小偷在行動。所以,要特別提醒諸位注意。 通過python操作數據庫的行為,除了能夠完成前面兩講中的操作之外(當然,那是比較常用的),其實任何對數據庫進行的操作,都能夠通過python-mysqldb來實現。 建立數據庫 在《用python操作數據庫(1)...
摘要:定義在中,用方括號表示一個,在方括號里面,可以是,也可以是類型的數據,甚至也能夠是這種布爾值。前面在對進行操作的時候,有一些內置函數,比如,這是去掉左右空格的內置函數,也是的方法。 前面的學習中,我們已經知道了兩種python的數據類型:int和str。再強調一下對數據類型的理解,這個世界是由數據組成的,數據可能是數字(注意,別搞混了,數字和數據是有區別的),也可能是文字、或者是聲音、...
摘要:語句,遍列列表字符串字典集合等迭代器,依次處理迭代器中的每個元素。與配合使用處理在程序運行中出現的異常情況。表示此行為空,不運行任何操作。在迭代器函數內使用,用于返回一個元素。恭請到上瀏覽及時更新的教程零基礎學 小孩子剛剛開始學說話的時候,常常是一個字一個字地開始學,比如學說餃子,對他/她來講,似乎有點難度,大人也聰明,于是就簡化了,用餃餃來代替,其實就是讓孩子學會一個字就能表達。當然...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:關于元組,上一講中涉及到了這個名詞。元組是用圓括號括起來的,其中的元素之間用逗號隔開。使用而不是如同擁有一個隱含的語句,說明這一數據是常量。必須是不可變的。只有字符串整數或其它對安全的才可以用作。 關于元組,上一講中涉及到了這個名詞。本講完整地講述它。 先看一個例子: >>>#變量引用str >>> s = abc >>> s abc >>>#如果這樣寫,就會是... >>> t...
摘要:一提到計算機,當然現在更多人把她叫做電腦,這兩個詞都是指。乃至于,有的人在口語中區分不開計算機和計算器。那么,做為零基礎學習這,也就從計算小學數學題目開始吧。因為從這里開始,數學的基礎知識列為肯定過關了。 一提到計算機,當然現在更多人把她叫做電腦,這兩個詞都是指computer。不管什么,只要提到她,普遍都會想到她能夠比較快地做加減乘除,甚至乘方開方等。乃至于,有的人在口語中區分不開計...
閱讀 537·2023-04-25 14:26
閱讀 1292·2021-11-25 09:43
閱讀 3485·2021-09-22 15:25
閱讀 1454·2019-08-30 15:54
閱讀 528·2019-08-30 12:57
閱讀 773·2019-08-29 17:24
閱讀 3170·2019-08-28 18:13
閱讀 2691·2019-08-28 17:52