欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

跟老齊學(xué)Python之使用Python操作數(shù)據(jù)庫(kù)(1)

 更新時(shí)間:2014年11月25日 16:24:57   投稿:hebedich  
本文詳細(xì)講述了使用python操作數(shù)據(jù)庫(kù)所需要了解的知識(shí)以及準(zhǔn)備工作,十分的詳盡,這里推薦給想學(xué)習(xí)python的小伙伴。

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

在關(guān)系數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)表是一系列二維數(shù)組的集合,用來(lái)代表和儲(chǔ)存數(shù)據(jù)對(duì)象之間的關(guān)系。它由縱向的列和橫向的行組成,例如一個(gè)有關(guān)作者信息的名為 authors 的表中,每個(gè)列包含的是所有作者的某個(gè)特定類型的信息,比如“姓氏”,而每行則包含了某個(gè)特定作者的所有信息:姓、名、住址等等。
對(duì)于特定的數(shù)據(jù)庫(kù)表,列的數(shù)目一般事先固定,各列之間可以由列名來(lái)識(shí)別。而行的數(shù)目可以隨時(shí)、動(dòng)態(tài)變化,每行通常都可以根據(jù)某個(gè)(或某幾個(gè))列中的數(shù)據(jù)來(lái)識(shí)別,稱為候選鍵。
我打算在qiwsirtest中建立一個(gè)存儲(chǔ)用戶名、用戶密碼、用戶郵箱的表,其結(jié)構(gòu)用二維表格表現(xiàn)如下:

username password email
qiwsir 123123 qiwsir@gmail.com

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

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

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

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

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

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

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

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

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)容就是上面所說(shuō)明的。

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

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

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

mysql> show tables;
+----------------------+
| Tables_in_qiwsirtest |
+----------------------+
| users                |
+----------------------+
1 row in set (0.00 sec)

查詢顯示,在qiwsirtest這個(gè)數(shù)據(jù)庫(kù)中,已經(jīng)有一個(gè)表,它的名字是:users。

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

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
特別提醒:在這里,我沒(méi)有對(duì)每個(gè)字段做注入不得為空等設(shè)置,在真正的開發(fā)中,或許必須讓username和password不得為空。

這個(gè)結(jié)構(gòu)和上面所期望的結(jié)構(gòu)是一樣的,只不過(guò)這個(gè)表中還沒(méi)有任何數(shù)據(jù),是一個(gè)空表??梢圆樵円幌驴纯矗?/p>

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

mysql> select * from users;
Empty set (0.01 sec)

目前表是空的,為了能夠在后面用python操作這個(gè)數(shù)據(jù)表,需要向里面插入點(diǎn)信息,就只插入一條吧。

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

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)完成了,接下來(lái)就是用python操作了。

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

要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,需要先連接它。上一講看官連接過(guò)了,但是,隨后你關(guān)閉了python的交互模式,所以還要從新連接。這也是交互模式的缺點(diǎn)。不過(guò)在這里操作直觀,所以暫且忍受一下,后面就會(huì)講解如何在程序中自動(dòng)完成了。

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

>>> import MySQLdb
>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",charset="utf8")

完成連接的過(guò)程,其實(shí)是建立了一個(gè)MySQLdb.connect()的實(shí)例對(duì)象conn,那么這個(gè)對(duì)象有哪些屬性呢?

commit():如果數(shù)據(jù)庫(kù)表進(jìn)行了修改,提交保存當(dāng)前的數(shù)據(jù)。當(dāng)然,如果此用戶沒(méi)有權(quán)限就作罷了,什么也不會(huì)發(fā)生。
rollback():如果有權(quán)限,就取消當(dāng)前的操作,否則報(bào)錯(cuò)。
cursor([cursorclass]):游標(biāo)指針。下面詳解。
連接成功之后,開始操作。注意:MySQLdb用游標(biāo)(指針)cursor的方式操作數(shù)據(jù)庫(kù),就是這樣:

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

>>> cur = conn.cursor()

因該模塊底層其實(shí)是調(diào)用CAPI的,所以,需要先得到當(dāng)前指向數(shù)據(jù)庫(kù)的指針。這也就提醒我們,在操作數(shù)據(jù)庫(kù)的時(shí)候,指針會(huì)移動(dòng),如果移動(dòng)到數(shù)據(jù)庫(kù)最后一條了,再查,就查不出什么來(lái)了??春竺娴睦泳兔靼琢?。

下面用cursor()提供的方法來(lái)進(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="python@gmail.com",這樣做:

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

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

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

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

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

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

在這里,特別請(qǐng)列位看官注意,通過(guò)"cur.execute()"對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作之后,沒(méi)有報(bào)錯(cuò),完全正確,但是不等于數(shù)據(jù)就已經(jīng)提交到數(shù)據(jù)庫(kù)中了,還必須要用到"MySQLdb.connect"的一個(gè)屬性:commit(),將數(shù)據(jù)提交上去,也就是進(jìn)行了"cur.execute()"操作,要將數(shù)據(jù)提交,必須執(zhí)行:

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

>>> conn.commit()

在到"mysql>"中運(yùn)行"select * from users"試一試:

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

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"才能保存。也就是在通過(guò)python操作數(shù)據(jù)庫(kù)的時(shí)候,以"execute()"執(zhí)行各種sql語(yǔ)句之后,要讓已經(jīng)執(zhí)行的效果保存,必須運(yùn)行"commit()",還要提醒,這個(gè)屬性是"MySQLdb.connect()"實(shí)例的。

再嘗試一下插入多條的那個(gè)命令"executemany(query,args)".

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

>>> 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é)果:

復(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      |
+----+----------+----------+------------------+
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í)行多次。只不過(guò)執(zhí)行過(guò)程不顯示給我們看罷了。

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

相關(guān)文章

  • django時(shí)區(qū)問(wèn)題的解決

    django時(shí)區(qū)問(wèn)題的解決

    我們都知道時(shí)區(qū),標(biāo)準(zhǔn)時(shí)區(qū)是UTC時(shí)區(qū),django默認(rèn)使用的就是UTC時(shí)區(qū),我們希望存儲(chǔ)在數(shù)據(jù)庫(kù)中的時(shí)間就是本地時(shí)間(東八區(qū)的時(shí)間),那么應(yīng)該怎么設(shè)置,就一起來(lái)了解一下
    2021-05-05
  • Python全排列操作實(shí)例分析

    Python全排列操作實(shí)例分析

    這篇文章主要介紹了Python全排列操作,結(jié)合實(shí)例形式分析了Python列表、字符串全排列算法,以及使用標(biāo)準(zhǔn)庫(kù)itertools進(jìn)行全排列的相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • 使用python存儲(chǔ)網(wǎng)頁(yè)上的圖片實(shí)例

    使用python存儲(chǔ)網(wǎng)頁(yè)上的圖片實(shí)例

    今天小編就為大家分享一篇使用python存儲(chǔ)網(wǎng)頁(yè)上的圖片實(shí)例,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python自然語(yǔ)言處理 NLTK 庫(kù)用法入門教程【經(jīng)典】

    Python自然語(yǔ)言處理 NLTK 庫(kù)用法入門教程【經(jīng)典】

    這篇文章主要介紹了Python自然語(yǔ)言處理 NLTK 庫(kù)用法,結(jié)合實(shí)例形式詳細(xì)分析了NLTK庫(kù)的功能、安裝、引用以及使用NLTK庫(kù)進(jìn)行文本分析的各種常用操作技巧,需要的朋友可以參考下
    2018-06-06
  • 3分鐘看懂Python后端必須知道的Django的信號(hào)機(jī)制

    3分鐘看懂Python后端必須知道的Django的信號(hào)機(jī)制

    這篇文章主要介紹了3分鐘看懂Python后端必須知道的Django的信號(hào)機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 在Python的列表中利用remove()方法刪除元素的教程

    在Python的列表中利用remove()方法刪除元素的教程

    這篇文章主要介紹了在Python的列表中利用remove()方法刪除元素的教程,是Python入門中的基礎(chǔ)知識(shí),注意其和pop()方法的區(qū)別,需要的朋友可以參考下
    2015-05-05
  • python tkinter窗口最大化的實(shí)現(xiàn)

    python tkinter窗口最大化的實(shí)現(xiàn)

    這篇文章主要介紹了python tkinter窗口最大化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python使用socket進(jìn)行簡(jiǎn)單網(wǎng)絡(luò)連接的方法

    python使用socket進(jìn)行簡(jiǎn)單網(wǎng)絡(luò)連接的方法

    這篇文章主要介紹了python使用socket進(jìn)行簡(jiǎn)單網(wǎng)絡(luò)連接的方法,實(shí)例分析了Python使用socket的基本技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Python數(shù)據(jù)分析庫(kù)PyGWalker的強(qiáng)大交互式功能界面探索

    Python數(shù)據(jù)分析庫(kù)PyGWalker的強(qiáng)大交互式功能界面探索

    這篇文章主要介紹了Python數(shù)據(jù)分析庫(kù)PyGWalker的強(qiáng)大交互式功能界面探索有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • PyTorch模型轉(zhuǎn)TensorRT是怎么實(shí)現(xiàn)的?

    PyTorch模型轉(zhuǎn)TensorRT是怎么實(shí)現(xiàn)的?

    今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著PyTorch模型轉(zhuǎn)TensorRT是怎么實(shí)現(xiàn)的展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論