標籤:中間 ace 行記錄 cte mys tab empty not monitor
在介紹python在資料庫中的操作之前先簡單介紹點mysql中的操作語言:
[[email protected] 2018-01-24]# mysql -u root -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 194Server version: 5.6.16 Source distributionCopyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.mysql> show databses;mysql> create table users(id int(2) not null primary key auto_increment,username varchar(40),passwordmysql > desc users;mysql > select * from users;mysql > insert into users(username,password,email) values("tiantian","tiange1003","[email protected]mysql > insert into users(username,password,email) values("zhiping","zhiping","[email protected]");mysql > select * from users;View Code
安裝python模組:
yum -y install python-MySQLdb
互動模式下操作資料庫:
>>> import MySQLdb>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="tiange1003",db="tian",port=3306,charset="utf8",unix_socket=‘/tmp/mysql.sock‘)
逐個解釋上述命令的含義:
host:等號的後面應該填寫mysql資料庫的地址,因為就資料庫就在本機上(也稱作本地),所以使用localhost,注意引號。如果在其他的伺服器上,這裡應該填寫ip地址,一般中小型的網站,資料庫和程式都是在同一台伺服器(電腦)上,就使用lcalhost了
user:登入資料庫的使用者名稱,這裡一般填寫“root”,還是要注意引號。當然,如果是比較大型的服務,資料庫會提供不同的使用者,那時候可以更改為相應使用者。但是,不同使用者的許可權可能不同,所以,在程式中,如果要操作資料庫,還要注意所擁有的許可權。在這裡用root,就放心了,什麼許可權都有啦。不過,這樣做,在大型系統中是應該避免的。
passwd:上述user賬戶對應的登入mysql的密碼。我在上面的粒子中用的密碼是"tiange1003",不要忘記引號
db:就是剛剛通過create命令建立的資料庫,我建立的資料庫名字是"tian",還是要注意引號。看管如果建立的資料庫名字不是這個,就寫自己所建資料庫的名字
port:一般情況,mysql的預設連接埠是3306,當mysql被安裝到伺服器之後,為了能夠允許網路訪問,伺服器要提供一個訪問連接埠給他
charset:這個設定,在很多教程中都不寫,如果在真正進行資料存放區的時候,發現有亂碼。這裡我將tian這個資料庫的編碼設定為utf-8格式,這樣就允許存入漢字而無亂碼了。注意,在mysql設定中,utf-8寫成utf8,沒有中間的橫線。但是在python檔案開頭和其他地方設定編碼格式的時候,要寫成utd-8,切記。
註:connect中的host、user、passwd等都可以不寫,只有在寫的時候按照host、user、passwd、db(可以不寫)、port順序寫就可以,注意連接埠號碼port=3306還是不要省略的為好,如果沒有db在port前面,直接寫3306回報錯。
就資料庫而言,串連之後就要對其操作,但是,目前那個名字叫tian的資料庫僅僅是個空架子,沒有什麼可操作的,要操作它,就必須在裡面建立“表”,什麼是資料庫的表呢?
在關係型資料庫中,資料庫表示一系列二維數組的集合,用來代表和儲存資料對象之間的關係。它由縱向的列和橫向的行組成,例如一個有關坐著資訊的名為authors的表中,每個列包含的是所有坐著的摩爾個特定類型的資訊,比如“姓氏”,而每行則包含了某個特定作者的所有資訊:姓、名、住址等等
對於特定的資料庫表,列的數目一般事先先固定,各列之間可以由列名來識別。而行的數目可以隨時,動態變化,每行通常都可以根據某個(或者幾個)列中的資料來識別,成為候選索引鍵
建立資料庫並插入資料:
mysql> use tian; 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.02 sec) 建立的這個資料表名稱是:users,其中包含上述欄位,可以用下面的方式看一看這個資料表的結構。 mysql> show tables; +----------------+ | Tables_in_tian | +----------------+ | users | +----------------+ 1 row in set (0.00 sec) 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的結構: id:每增加一個使用者,id號自動增加一個 username“儲存使用者名稱,類型是varchar(40) password:儲存使用者密碼,類型是text email:儲存使用者的郵箱,類型是text 這個結構和上面所期望的結構是一樣的,只不過這個表中還沒有任何資料, 是一個空表,可以查詢一下看看: mysql> select * from users; Empty set (0.00 sec) 目前表示空的,為了能夠在後面用python操作這個資料表,需要向裡面插入點資訊: mysql> insert into users(username,password,email) values("tiantian","tiange1003","[email protected]"); Query OK, 1 row affected (0.00 sec) mysql> select * from users; +----+----------+------------+------------------------+ | id | username | password | email | +----+----------+------------+------------------------+ | 1 | tiantian | tiange1003 | [email protected] | +----+----------+------------+------------------------+ 1 row in set (0.00 sec)
到目前為止,在mysql中的工作已經完成,接下來就是用python操作了:
>>> import MySQLdb>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="tiange1003",db="tian",port=3306,charset="utf8",unix_socket=‘/tmp/mysql.sock‘)>>> cur = conn.cursor()>>> cur.execute("insert into users(username,password,email) values (%s,%s,%s)",("chenchen","chenchen","[email protected]"))>>> conn.commit()
上面是python互動模式下的串連,完成串連的過程,其實是建立一個MySQLdb.connect()的執行個體對象conn,那麼這個對象有哪些屬性
commit():如果資料庫表進行了修改,提交儲存當前的資料。當然,如果此使用者沒有許可權就作罷了,什麼都不會發生
rollback():沒有許可權,就取消當前的操作,否則報錯
curso():遊標指標
串連成功之後,開始操作。注意:MySQLdb用遊標(指標)cursor的方式操作資料庫,就是這樣:
>>> cur = conn.cursor()
因改模組底層其實是調用CAPS的,所以,需要先得到當前指向資料庫的指標,這也就是提醒我們,在操作資料庫的時候,指標會移動,如果移動到資料最後一條,再查,就查不出來什麼來了。
cursor執行命令的方法:
execute(query,srgs):執行單條sql語句。query為sql語句本身,srgs為參數值的列表。執行後傳回值為受影響的行數
executemany(query,args):執行單條sql語句,但是重複執行參數列表裡的參數,傳回值為受影響的行數
>>> cur.execute("insert into users(username,password,email) values (%s,%s,%s)",("chenchen","chenchen","[email protected]"))1L
沒有報錯,並且返回一個"1L"結果,說明有一行記錄操作成功。可以去mysql裡面使用sql語言查看,但是查看的時候並沒有顯示成功,這裡的原因是通過"cur.execute()"對資料庫進行操作之後,沒有報錯,完全正確,但是不等於資料就已經提交到資料庫中,還必須要用到"Mysql.connect"的一個屬性:commit(),將資料提交上去,也及時進行了"cur.execute()"操作,要講資料提交,必須執行:
>>> conn.commit()
然後再去mysql裡面使用sql語言查詢的時候,會出現下面的效果:
mysql> select * from users;+----+----------+------------+------------------------+| id | username | password | email |+----+----------+------------+------------------------+| 1 | tiantian | tiange1003 | [email protected] || 2 | zhiping | zhiping | 785298065@qq.com || 3 | chenchen | chenchen | 12345678@qq.com |+----+----------+------------+------------------------+3 rows in set (0.00 sec)
再嘗試一下插入多條的那個命令"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
接著在mysql中使用sql語言繼續查詢:
mysql> select * from users;+----+----------+------------+------------------------+| id | username | password | email |+----+----------+------------+------------------------+| 1 | tiantian | tiange1003 | [email protected] || 2 | zhiping | zhiping | 785298065@qq.com || 3 | chenchen | chenchen | 12345678@qq.com || 4 | google | 111222 | [email protected] || 5 | facebook | 222333 | [email protected] || 6 | github | 333444 | [email protected] || 7 | docker | 444555 | [email protected] |+----+----------+------------+------------------------+7 rows in set (0.00 sec)
成功插入了多條記錄。也別需要注意的是,在“exectemany(query,args)”中,query還是一條sql語句,但是args這時候是一個tuplie,這個tuple裡面的元素也是tuple,每個tuple分別對應sql語句中的欄位列表。這句話其實被執行多次。只不過執行過程不顯示給我們看罷了。
python串連mysql資料庫(MySQL)