湯神36分格林搶斷三雙 勇士復(fù)仇灰熊

"So do not worry about tomorrow, for tomorrow will bring worries of its own. Today's trouble is enought for today." (MATTHEW 7:34)

用Python操作數(shù)據(jù)庫(1)

上一講中已經(jīng)連接了數(shù)據(jù)庫虹菲。就數(shù)據(jù)庫而言,連接之后就要對(duì)其操作涡尘。但是住涉,目前那個(gè)名字叫做qiwsirtest的數(shù)據(jù)僅僅是空架子结榄,沒有什么可操作的,要操作它,就必須在里面建立“表”舶赔,什么是數(shù)據(jù)庫的表呢?下面摘抄自維基百科對(duì)數(shù)據(jù)庫表的簡(jiǎn)要解釋谦秧,要想詳細(xì)了解竟纳,需要看官在找一些有關(guān)數(shù)據(jù)庫的教程和書籍來看看撵溃。

在關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)庫表是一系列二維數(shù)組的集合锥累,用來代表和儲(chǔ)存數(shù)據(jù)對(duì)象之間的關(guān)系缘挑。它由縱向的列和橫向的行組成,例如一個(gè)有關(guān)作者信息的名為 authors 的表中桶略,每個(gè)列包含的是所有作者的某個(gè)特定類型的信息语淘,比如“姓氏”,而每行則包含了某個(gè)特定作者的所有信息:姓际歼、名惶翻、住址等等。

對(duì)于特定的數(shù)據(jù)庫表鹅心,列的數(shù)目一般事先固定吕粗,各列之間可以由列名來識(shí)別。而行的數(shù)目可以隨時(shí)旭愧、動(dòng)態(tài)變化颅筋,每行通常都可以根據(jù)某個(gè)(或某幾個(gè))列中的數(shù)據(jù)來識(shí)別,稱為候選鍵输枯。

我打算在qiwsirtest中建立一個(gè)存儲(chǔ)用戶名垃沦、用戶密碼、用戶郵箱的表用押,其結(jié)構(gòu)用二維表格表現(xiàn)如下:

username password email
qiwsir 123123 qiwsir@gmail.com

特別說明肢簿,這里為了簡(jiǎn)化細(xì)節(jié),突出重點(diǎn)蜻拨,對(duì)密碼不加密池充,直接明文保存,雖然這種方式是很不安全的缎讼。但是收夸,有不少網(wǎng)站還都這么做的,這么做的目的是比較可惡的血崭。就讓我在這里卧惜,僅僅在這里可惡一次。

建數(shù)據(jù)庫表并插入數(shù)據(jù)

為了在數(shù)據(jù)庫中建立這個(gè)表夹纫,需要進(jìn)入到mysql>交互模式中操作咽瓷。道理在于,如果qiwsirtest這個(gè)屋子里面沒有類似家具的各種數(shù)據(jù)庫表舰讹,即使進(jìn)了屋子也沒有什么好操作的東西茅姜,因此需要先到mysql>模式下在屋子里面擺家具。

進(jìn)入數(shù)據(jù)庫交互模式:

qw@qw-Latitude-E4300:~$ mysql -u root -p
Enter password: 

調(diào)用已經(jīng)建立的數(shù)據(jù)庫:qiwsirtest

mysql> use qiwsirtest;
Database changed
mysql> show tables;
Empty set (0.00 sec)

show tables命令顯示這個(gè)數(shù)據(jù)庫中是否有數(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ù)庫中粪狼,已經(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è)空表猜敢」煤桑可以查詢一下看看:

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","qiwsir@gmail.com");
Query OK, 1 row affected (0.05 sec)

mysql> select * from users;
+----+----------+----------+------------------+
| id | username | password | email            |
+----+----------+----------+------------------+
|  1 | qiwsir   | 123123   | qiwsir@gmail.com |
+----+----------+----------+------------------+
1 row in set (0.00 sec)

到目前為止胯盯,在mysql>中的工作已經(jīng)完成了懈费,接下來就是用python操作了。

python操作數(shù)據(jù)庫

要對(duì)數(shù)據(jù)庫進(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ù)庫表進(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ù)庫丢胚,就是這樣:

>>> cur = conn.cursor()

因該模塊底層其實(shí)是調(diào)用CAPI的,所以受扳,需要先得到當(dāng)前指向數(shù)據(jù)庫的指針携龟。這也就提醒我們,在操作數(shù)據(jù)庫的時(shí)候勘高,指針會(huì)移動(dòng)峡蟋,如果移動(dòng)到數(shù)據(jù)庫最后一條了,再查华望,就查不出什么來了层亿。看后面的例子就明白了立美。

下面用cursor()提供的方法來進(jìn)行操作匿又,方法主要是:

  1. 執(zhí)行命令
  2. 接收結(jié)果

cursor執(zhí)行命令的方法:

  • execute(query, args):執(zhí)行單條sql語句。query為sql語句本身建蹄,args為參數(shù)值的列表碌更。執(zhí)行后返回值為受影響的行數(shù)。
  • executemany(query, args):執(zhí)行單條sql語句,但是重復(fù)執(zhí)行參數(shù)列表里的參數(shù),返回值為受影響的行數(shù)

例如洞慎,要在數(shù)據(jù)表users中插入一條記錄痛单,使得:username="python",password="123456",email="python@gmail.com",這樣做:

>>> cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("python","123456","python@gmail.com"))
1L

沒有報(bào)錯(cuò)劲腿,并且返回一個(gè)"1L"結(jié)果旭绒,說明有一行記錄操作成功。不妨用"mysql>"交互方式查看一下:

mysql> select * from users;
+----+----------+----------+------------------+
| id | username | password | email            |
+----+----------+----------+------------------+
|  1 | qiwsir   | 123123   | qiwsir@gmail.com |
+----+----------+----------+------------------+
1 row in set (0.00 sec)

咦,奇怪呀挥吵。怎么沒有看到增加的那一條呢重父?哪里錯(cuò)了?可是上面也沒有報(bào)錯(cuò)呀忽匈。

在這里房午,特別請(qǐng)列位看官注意,通過"cur.execute()"對(duì)數(shù)據(jù)庫進(jìn)行操作之后丹允,沒有報(bào)錯(cuò)郭厌,完全正確,但是不等于數(shù)據(jù)就已經(jīng)提交到數(shù)據(jù)庫中了雕蔽,還必須要用到"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   | qiwsir@gmail.com |
|  2 | python   | 123456   | python@gmail.com |
+----+----------+----------+------------------+
2 rows in set (0.00 sec)

good,very good贾陷。果然如此缘眶。這就如同編寫一個(gè)文本一樣,將文字寫到文本上髓废,并不等于文字已經(jīng)保留在文本文件中了巷懈,必須執(zhí)行"CTRL-S"才能保存。也就是在通過python操作數(shù)據(jù)庫的時(shí)候慌洪,以"execute()"執(zhí)行各種sql語句之后顶燕,要讓已經(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","g@gmail.com"),("facebook","222333","f@face.book"),("github","333444","git@hub.com"),("docker","444555","doc@ker.com")))
4L
>>> conn.commit()

到"mysql>"里面看結(jié)果:

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      |
+----+----------+----------+------------------+
6 rows in set (0.00 sec)

成功插入了多條記錄频伤。特別請(qǐng)列位注意的是恳谎,在"executemany(query,args)"中,query還是一條sql語句憋肖,但是args這時(shí)候是一個(gè)tuple因痛,這個(gè)tuple里面的元素也是tuple,每個(gè)tuple分別對(duì)應(yīng)sql語句中的字段列表岸更。這句話其實(shí)被執(zhí)行多次鸵膏。只不過執(zhí)行過程不顯示給我們看罷了。

已經(jīng)會(huì)插入了怎炊,然后就可以有更多動(dòng)作谭企。且看下一講吧廓译。


首頁??|??上一講:通過Python連接數(shù)據(jù)庫??|??下一講:用Python操作數(shù)據(jù)庫(2)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市债查,隨后出現(xiàn)的幾起案子非区,更是在濱河造成了極大的恐慌,老刑警劉巖攀操,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院仿,死亡現(xiàn)場(chǎng)離奇詭異秸抚,居然都是意外死亡速和,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門剥汤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颠放,“玉大人,你說我怎么就攤上這事吭敢∨鲂祝” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鹿驼,是天一觀的道長(zhǎng)欲低。 經(jīng)常有香客問我,道長(zhǎng)畜晰,這世上最難降的妖魔是什么砾莱? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮凄鼻,結(jié)果婚禮上腊瑟,老公的妹妹穿的比我還像新娘。我一直安慰自己块蚌,他們只是感情好闰非,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峭范,像睡著了一般财松。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纱控,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天游岳,我揣著相機(jī)與錄音,去河邊找鬼其徙。 笑死胚迫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唾那。 我是一名探鬼主播访锻,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼褪尝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了期犬?” 一聲冷哼從身側(cè)響起河哑,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎龟虎,沒想到半個(gè)月后璃谨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤妥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年佳吞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棉安。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡底扳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贡耽,到底是詐尸還是另有隱情衷模,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布蒲赂,位于F島的核電站阱冶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滥嘴。R本人自食惡果不足惜木蹬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氏涩。 院中可真熱鬧届囚,春花似錦、人聲如沸是尖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饺汹。三九已至蛔添,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兜辞,已是汗流浹背迎瞧。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逸吵,地道東北人凶硅。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扫皱,于是被迫代替她去往敵國和親足绅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捷绑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容