在上一講中已經鏈接了數據庫。就數據庫而言,鏈接以後就要對其操做。可是,目前那個名字叫作qiwsirtest的數據僅僅是空架子,沒有什麼可操做的,要操做它,就必須在裏面創建「表」,什麼是數據庫的表呢?下面摘抄字維基百科對數據庫表的簡要解釋,要想詳細瞭解,須要看官在找一些有關數據庫的教程和書籍來看看。python
在關係數據庫中,數據庫表是一系列二維數組的集合,用來表明和儲存數據對象之間的關係。它由縱向的列和橫向的行組成,例如一個有關做者信息的名爲 authors 的表中,每一個列包含的是全部做者的某個特定類型的信息,好比「姓氏」,而每行則包含了某個特定做者的全部信息:姓、名、住址等等。mysql
對於特定的數據庫表,列的數目通常事先固定,各列之間能夠由列名來識別。而行的數目能夠隨時、動態變化,每行一般均可以根據某個(或某幾個)列中的數據來識別,稱爲候選鍵。git
我打算在qiwsirtest中創建一個存儲用戶名、用戶密碼、用戶郵箱的表,其結構用二維表格表現以下:github
username | password | |
---|---|---|
qiwsir | 123123 | qiwsir@gmail.com |
特別說明,這裏爲了簡化細節,突出重點,對密碼不加密,直接明文保存,雖然這種方式是很不安全的。可是,有很多網站還都這麼作的,這麼作的目的是比較可惡的。就讓我在這裏,僅僅在這裏可惡一次。sql
爲了在數據庫中創建這個表,須要進入到mysql>
交互模式中操做。道理在於,若是qiwsirtest這個屋子裏面沒有相似傢俱的各類數據庫表,即便進了屋子也沒有什麼好操做的東西,所以須要先到mysql>
模式下在屋子裏面擺傢俱。docker
進入數據庫交互模式:數據庫
qw@qw-Latitude-E4300:~$ mysql -u root -p Enter password:
調用已經創建的數據庫:qiwsirtest數組
mysql> use qiwsirtest; Database changed mysql> show tables; Empty set (0.00 sec)
用show tables
命令顯示這個數據庫中是否有數據表了。查詢結果顯示爲空。安全
下面就用以下命令創建一個數據表,這個數據表的內容就是上面所說明的。網站
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)
創建的這個數據表名稱是:users,其中包含上述字段,能夠用下面的方式看一看這個數據表的結構。
mysql> show tables; +----------------------+ | Tables_in_qiwsirtest | +----------------------+ | users | +----------------------+ 1 row in set (0.00 sec)
查詢顯示,在qiwsirtest這個數據庫中,已經有一個表,它的名字是: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的結構:
特別提醒:在這裏,我沒有對每一個字段作注入不得爲空等設置,在真正的開發中,或許必須讓username和password不得爲空。
這個結構和上面所指望的結構是同樣的,只不過這個表中尚未任何數據,是一個空表。能夠查詢一下看看:
mysql> select * from users; Empty set (0.01 sec)
目前表是空的,爲了可以在後面用python操做這個數據表,須要向裏面插入點信息,就只插入一條吧。
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>
中的工做已經完成了,接下來就是用python操做了。
要對數據庫進行操做,須要先鏈接它。上一講看官鏈接過了,可是,隨後你關閉了python的交互模式,因此還要重新鏈接。這也是交互模式的缺點。不過在這裏操做直觀,因此暫且忍受一下,後面就會講解如何在程序中自動完成了。
>>> import MySQLdb >>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",charset="utf8")
完成鏈接的過程,實際上是創建了一個MySQLdb.connect()
的實例對象conn,那麼這個對象有哪些屬性呢?
鏈接成功以後,開始操做。注意:MySQLdb用遊標(指針)cursor的方式操做數據庫,就是這樣:
>>> cur = conn.cursor()
因該模塊底層實際上是調用CAPI的,因此,須要先獲得當前指向數據庫的指針。這也就提醒咱們,在操做數據庫的時候,指針會移動,若是移動到數據庫最後一條了,再查,就查不出什麼來了。看後面的例子就明白了。
下面用cursor()提供的方法來進行操做,方法主要是:
例如,要在數據表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
沒有報錯,而且返回一個"1L"結果,說明有一行記錄操做成功。不妨用"mysql>"交互方式查看一下:
mysql> select * from users; +----+----------+----------+------------------+ | id | username | password | email | +----+----------+----------+------------------+ | 1 | qiwsir | 123123 | qiwsir@gmail.com | +----+----------+----------+------------------+ 1 row in set (0.00 sec)
咦,奇怪呀。怎麼沒有看到增長的那一條呢?哪裏錯了?但是上面也沒有報錯呀。
在這裏,特別請列位看官注意,經過"cur.execute()"對數據庫進行操做以後,沒有報錯,徹底正確,可是不等於數據就已經提交到數據庫中了,還必需要用到"MySQLdb.connect"的一個屬性:commit(),將數據提交上去,也就是進行了"cur.execute()"操做,要將數據提交,必須執行:
>>> conn.commit()
在到"mysql>"中運行"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。果真如此。這就如同編寫一個文本同樣,將文字寫到文本上,並不等於文字已經保留在文本文件中了,必須執行"CTRL-S"才能保存。也就是在經過python操做數據庫的時候,以"execute()"執行各類sql語句以後,要讓已經執行的效果保存,必須運行"commit()",還要提醒,這個屬性是"MySQLdb.connect()"實例的。
再嘗試一下插入多條的那個命令"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>"裏面看結果:
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)
成功插入了多條記錄。特別請列位注意的是,在"executemany(query,args)"中,query仍是一條sql語句,可是args這時候是一個tuple,這個tuple裏面的元素也是tuple,每一個tuple分別對應sql語句中的字段列表。這句話其實被執行屢次。只不過執行過程不顯示給咱們看罷了。
已經會插入了,而後就能夠有更多動做。且看下一講吧。