摘要:操作數(shù)據(jù)庫(kù)要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,需要先連接它。執(zhí)行后返回值為受影響的行數(shù)。執(zhí)行單條語(yǔ)句但是重復(fù)執(zhí)行參數(shù)列表里的參數(shù)返回值為受影響的行數(shù)例如,要在數(shù)據(jù)表中插入一條記錄,使得,這樣做沒有報(bào)錯(cuò),并且返回一個(gè)結(jié)果,說明有一行記錄操作成功。
在上一講中已經(jīng)連接了數(shù)據(jù)庫(kù)。就數(shù)據(jù)庫(kù)而言,連接之后就要對(duì)其操作。但是,目前那個(gè)名字叫做qiwsirtest的數(shù)據(jù)僅僅是空架子,沒有什么可操作的,要操作它,就必須在里面建立“表”,什么是數(shù)據(jù)庫(kù)的表呢?下面摘抄字維基百科對(duì)數(shù)據(jù)庫(kù)表的簡(jiǎn)要解釋,要想詳細(xì)了解,需要看官在找一些有關(guān)數(shù)據(jù)庫(kù)的教程和書籍來看看。
在關(guān)系數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)表是一系列二維數(shù)組的集合,用來代表和儲(chǔ)存數(shù)據(jù)對(duì)象之間的關(guān)系。它由縱向的列和橫向的行組成,例如一個(gè)有關(guān)作者信息的名為 authors 的表中,每個(gè)列包含的是所有作者的某個(gè)特定類型的信息,比如“姓氏”,而每行則包含了某個(gè)特定作者的所有信息:姓、名、住址等等。
對(duì)于特定的數(shù)據(jù)庫(kù)表,列的數(shù)目一般事先固定,各列之間可以由列名來識(shí)別。而行的數(shù)目可以隨時(shí)、動(dòng)態(tài)變化,每行通常都可以根據(jù)某個(gè)(或某幾個(gè))列中的數(shù)據(jù)來識(shí)別,稱為候選鍵。
我打算在qiwsirtest中建立一個(gè)存儲(chǔ)用戶名、用戶密碼、用戶郵箱的表,其結(jié)構(gòu)用二維表格表現(xiàn)如下:
username | password | |
---|---|---|
qiwsir | 123123 | [email protected] |
特別說明,這里為了簡(jiǎn)化細(xì)節(jié),突出重點(diǎn),對(duì)密碼不加密,直接明文保存,雖然這種方式是很不安全的。但是,有不少網(wǎng)站還都這么做的,這么做的目的是比較可惡的。就讓我在這里,僅僅在這里可惡一次。
建數(shù)據(jù)庫(kù)表并插入數(shù)據(jù)為了在數(shù)據(jù)庫(kù)中建立這個(gè)表,需要進(jìn)入到mysql>交互模式中操作。道理在于,如果qiwsirtest這個(gè)屋子里面沒有類似家具的各種數(shù)據(jù)庫(kù)表,即使進(jìn)了屋子也沒有什么好操作的東西,因此需要先到mysql>模式下在屋子里面擺家具。
進(jìn)入數(shù)據(jù)庫(kù)交互模式:
qw@qw-Latitude-E4300:~$ mysql -u root -p Enter password:
調(diào)用已經(jīng)建立的數(shù)據(jù)庫(kù):qiwsirtest
mysql> use qiwsirtest; Database changed mysql> show tables; Empty set (0.00 sec)
用show tables命令顯示這個(gè)數(shù)據(jù)庫(kù)中是否有數(shù)據(jù)表了。查詢結(jié)果顯示為空。
下面就用如下命令建立一個(gè)數(shù)據(jù)表,這個(gè)數(shù)據(jù)表的內(nèi)容就是上面所說明的。
mysql> create table users(id int(2) not null primary key auto_increment,username varchar(40),password text,email text)default charset=utf8; Query OK, 0 rows affected (0.12 sec)
建立的這個(gè)數(shù)據(jù)表名稱是:users,其中包含上述字段,可以用下面的方式看一看這個(gè)數(shù)據(jù)表的結(jié)構(gòu)。
mysql> show tables; +----------------------+ | Tables_in_qiwsirtest | +----------------------+ | users | +----------------------+ 1 row in set (0.00 sec)
查詢顯示,在qiwsirtest這個(gè)數(shù)據(jù)庫(kù)中,已經(jīng)有一個(gè)表,它的名字是:users。
mysql> desc users; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | id | int(2) | NO | PRI | NULL | auto_increment | | username | varchar(40) | YES | | NULL | | | password | text | YES | | NULL | | | email | text | YES | | NULL | | +----------+-------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
顯示表users的結(jié)構(gòu):
id:每增加一個(gè)用戶,id號(hào)自動(dòng)增加一個(gè)。
username:存儲(chǔ)用戶名,類型是varchar(40)
password:存儲(chǔ)用戶密碼,類型是text
email:存儲(chǔ)用戶的郵箱,類型是text
特別提醒:在這里,我沒有對(duì)每個(gè)字段做注入不得為空等設(shè)置,在真正的開發(fā)中,或許必須讓username和password不得為空。
這個(gè)結(jié)構(gòu)和上面所期望的結(jié)構(gòu)是一樣的,只不過這個(gè)表中還沒有任何數(shù)據(jù),是一個(gè)空表??梢圆樵円幌驴纯矗?/p>
mysql> select * from users; Empty set (0.01 sec)
目前表是空的,為了能夠在后面用python操作這個(gè)數(shù)據(jù)表,需要向里面插入點(diǎn)信息,就只插入一條吧。
mysql> insert into users(username,password,email) values("qiwsir","123123","[email protected]"); Query OK, 1 row affected (0.05 sec) mysql> select * from users; +----+----------+----------+------------------+ | id | username | password | email | +----+----------+----------+------------------+ | 1 | qiwsir | 123123 | [email protected] | +----+----------+----------+------------------+ 1 row in set (0.00 sec)
到目前為止,在mysql>中的工作已經(jīng)完成了,接下來就是用python操作了。
python操作數(shù)據(jù)庫(kù)要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,需要先連接它。上一講看官連接過了,但是,隨后你關(guān)閉了python的交互模式,所以還要從新連接。這也是交互模式的缺點(diǎn)。不過在這里操作直觀,所以暫且忍受一下,后面就會(huì)講解如何在程序中自動(dòng)完成了。
>>> import MySQLdb >>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",charset="utf8")
完成連接的過程,其實(shí)是建立了一個(gè)MySQLdb.connect()的實(shí)例對(duì)象conn,那么這個(gè)對(duì)象有哪些屬性呢?
commit():如果數(shù)據(jù)庫(kù)表進(jìn)行了修改,提交保存當(dāng)前的數(shù)據(jù)。當(dāng)然,如果此用戶沒有權(quán)限就作罷了,什么也不會(huì)發(fā)生。
rollback():如果有權(quán)限,就取消當(dāng)前的操作,否則報(bào)錯(cuò)。
cursor([cursorclass]):游標(biāo)指針。下面詳解。
連接成功之后,開始操作。注意:MySQLdb用游標(biāo)(指針)cursor的方式操作數(shù)據(jù)庫(kù),就是這樣:
>>> cur = conn.cursor()
因該模塊底層其實(shí)是調(diào)用CAPI的,所以,需要先得到當(dāng)前指向數(shù)據(jù)庫(kù)的指針。這也就提醒我們,在操作數(shù)據(jù)庫(kù)的時(shí)候,指針會(huì)移動(dòng),如果移動(dòng)到數(shù)據(jù)庫(kù)最后一條了,再查,就查不出什么來了。看后面的例子就明白了。
下面用cursor()提供的方法來進(jìn)行操作,方法主要是:
執(zhí)行命令
接收結(jié)果
cursor執(zhí)行命令的方法:execute(query, args):執(zhí)行單條sql語(yǔ)句。query為sql語(yǔ)句本身,args為參數(shù)值的列表。執(zhí)行后返回值為受影響的行數(shù)。
executemany(query, args):執(zhí)行單條sql語(yǔ)句,但是重復(fù)執(zhí)行參數(shù)列表里的參數(shù),返回值為受影響的行數(shù)
例如,要在數(shù)據(jù)表users中插入一條記錄,使得:username="python",password="123456",email="[email protected]",這樣做:
>>> cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("python","123456","[email protected]")) 1L
沒有報(bào)錯(cuò),并且返回一個(gè)"1L"結(jié)果,說明有一行記錄操作成功。不妨用"mysql>"交互方式查看一下:
mysql> select * from users; +----+----------+----------+------------------+ | id | username | password | email | +----+----------+----------+------------------+ | 1 | qiwsir | 123123 | [email protected] | +----+----------+----------+------------------+ 1 row in set (0.00 sec)
咦,奇怪呀。怎么沒有看到增加的那一條呢?哪里錯(cuò)了?可是上面也沒有報(bào)錯(cuò)呀。
在這里,特別請(qǐng)列位看官注意,通過"cur.execute()"對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作之后,沒有報(bào)錯(cuò),完全正確,但是不等于數(shù)據(jù)就已經(jīng)提交到數(shù)據(jù)庫(kù)中了,還必須要用到"MySQLdb.connect"的一個(gè)屬性:commit(),將數(shù)據(jù)提交上去,也就是進(jìn)行了"cur.execute()"操作,要將數(shù)據(jù)提交,必須執(zhí)行:
>>> conn.commit()
在到"mysql>"中運(yùn)行"select * from users"試一試:
mysql> select * from users; +----+----------+----------+------------------+ | id | username | password | email | +----+----------+----------+------------------+ | 1 | qiwsir | 123123 | [email protected] | | 2 | python | 123456 | [email protected] | +----+----------+----------+------------------+ 2 rows in set (0.00 sec)
good,very good。果然如此。這就如同編寫一個(gè)文本一樣,將文字寫到文本上,并不等于文字已經(jīng)保留在文本文件中了,必須執(zhí)行"CTRL-S"才能保存。也就是在通過python操作數(shù)據(jù)庫(kù)的時(shí)候,以"execute()"執(zhí)行各種sql語(yǔ)句之后,要讓已經(jīng)執(zhí)行的效果保存,必須運(yùn)行"commit()",還要提醒,這個(gè)屬性是"MySQLdb.connect()"實(shí)例的。
再嘗試一下插入多條的那個(gè)命令"executemany(query,args)".
>>> cur.executemany("insert into users (username,password,email) values (%s,%s,%s)",(("google","111222","[email protected]"),("facebook","222333","[email protected]"),("github","333444","[email protected]"),("docker","444555","[email protected]"))) 4L >>> conn.commit()
到"mysql>"里面看結(jié)果:
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] | +----+----------+----------+------------------+ 6 rows in set (0.00 sec)
成功插入了多條記錄。特別請(qǐng)列位注意的是,在"executemany(query,args)"中,query還是一條sql語(yǔ)句,但是args這時(shí)候是一個(gè)tuple,這個(gè)tuple里面的元素也是tuple,每個(gè)tuple分別對(duì)應(yīng)sql語(yǔ)句中的字段列表。這句話其實(shí)被執(zhí)行多次。只不過執(zhí)行過程不顯示給我們看罷了。
已經(jīng)會(huì)插入了,然后就可以有更多動(dòng)作。且看下一講吧。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37431.html
摘要:用選擇要操作的數(shù)據(jù)庫(kù),然后通過指針就可以操作這個(gè)數(shù)據(jù)庫(kù)了。這樣就在這個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)名為的表這是查看表的方式。樹欲靜而風(fēng)不止,小偷在行動(dòng)。所以,要特別提醒諸位注意。 通過python操作數(shù)據(jù)庫(kù)的行為,除了能夠完成前面兩講中的操作之外(當(dāng)然,那是比較常用的),其實(shí)任何對(duì)數(shù)據(jù)庫(kù)進(jìn)行的操作,都能夠通過python-mysqldb來實(shí)現(xiàn)。 建立數(shù)據(jù)庫(kù) 在《用python操作數(shù)據(jù)庫(kù)(1)...
摘要:定義在中,用方括號(hào)表示一個(gè),在方括號(hào)里面,可以是,也可以是類型的數(shù)據(jù),甚至也能夠是這種布爾值。前面在對(duì)進(jìn)行操作的時(shí)候,有一些內(nèi)置函數(shù),比如,這是去掉左右空格的內(nèi)置函數(shù),也是的方法。 前面的學(xué)習(xí)中,我們已經(jīng)知道了兩種python的數(shù)據(jù)類型:int和str。再?gòu)?qiáng)調(diào)一下對(duì)數(shù)據(jù)類型的理解,這個(gè)世界是由數(shù)據(jù)組成的,數(shù)據(jù)可能是數(shù)字(注意,別搞混了,數(shù)字和數(shù)據(jù)是有區(qū)別的),也可能是文字、或者是聲音、...
摘要:語(yǔ)句,遍列列表字符串字典集合等迭代器,依次處理迭代器中的每個(gè)元素。與配合使用處理在程序運(yùn)行中出現(xiàn)的異常情況。表示此行為空,不運(yùn)行任何操作。在迭代器函數(shù)內(nèi)使用,用于返回一個(gè)元素。恭請(qǐng)到上瀏覽及時(shí)更新的教程零基礎(chǔ)學(xué) 小孩子剛剛開始學(xué)說話的時(shí)候,常常是一個(gè)字一個(gè)字地開始學(xué),比如學(xué)說餃子,對(duì)他/她來講,似乎有點(diǎn)難度,大人也聰明,于是就簡(jiǎn)化了,用餃餃來代替,其實(shí)就是讓孩子學(xué)會(huì)一個(gè)字就能表達(dá)。當(dāng)然...
摘要:楚江數(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...
摘要:關(guān)于元組,上一講中涉及到了這個(gè)名詞。元組是用圓括號(hào)括起來的,其中的元素之間用逗號(hào)隔開。使用而不是如同擁有一個(gè)隱含的語(yǔ)句,說明這一數(shù)據(jù)是常量。必須是不可變的。只有字符串整數(shù)或其它對(duì)安全的才可以用作。 關(guān)于元組,上一講中涉及到了這個(gè)名詞。本講完整地講述它。 先看一個(gè)例子: >>>#變量引用str >>> s = abc >>> s abc >>>#如果這樣寫,就會(huì)是... >>> t...
摘要:還有別的方法得到鍵值嗎有一般不是只有一個(gè)方法實(shí)現(xiàn)某個(gè)操作的。刪除鍵值對(duì)的方法有兩個(gè),但是兩者有一點(diǎn)區(qū)別,根據(jù)刪除相應(yīng)的鍵值對(duì),并返回該值沒有返回值,如果刪除鍵不存在,返回錯(cuò)誤用可以把合并到中。 dict的很多方法跟list有類似的地方,下面一一道來,并且會(huì)跟list做一個(gè)對(duì)比 嵌套 嵌套在list中也存在,就是元素是list,在dict中,也有類似的樣式: >>> a_list ...
閱讀 1355·2021-11-11 16:54
閱讀 2398·2021-09-22 10:51
閱讀 2663·2019-08-30 15:44
閱讀 3214·2019-08-29 17:05
閱讀 1459·2019-08-29 17:01
閱讀 2918·2019-08-29 12:28
閱讀 2481·2019-08-26 13:50
閱讀 1738·2019-08-23 16:47