初見Python<7>:Python操作mysql


1、基本介紹:

python標准數據庫接口為python DB-API,它為開發人員提供了數據庫應用編程接口,可以支持mysql、Oracle、MSSQL、Sybase等多種數據庫,不同的數據庫需要下載不同的DB-API模塊。
DBI-API是一個規范,它定義了一系列必須的對象和數據庫存取方式,以便為各種各樣的底層數據庫系統和多種多樣的數據庫接口程序提供一致的訪問接口。
python DB-API的使用流程是:
①引入API模塊;②獲取與數據庫的連接;③執行SQL語句;④關閉數據庫連接。
 
2、什么是MySQLdb?
MySQLdb-python是用於Python鏈接Mysql數據庫的接口程序,python通過它實現對mysql數據庫的各種操作。
使用之前必須保證MySQLdb已經在本地機上安裝(當然,mysql程序也是必須要安裝的)。
直接在網站上下載完MySQLdb-python安裝包,安裝完成即可。
通過檢查MySQLdb模塊是否正常導入來判斷MySQLdb-python程序是否安裝成功。
 
沒有報錯就代表安裝成功。注意python是區分大小寫的。
 
3、連接數據庫:
 
說明:通過connect函數連接數據庫,里面需要提供主機地址、端口、用戶名、密碼、數據庫名稱等信息。
報錯的原因是本地機上mysql服務沒有開啟。這時需要在命令行中通過net start mysql命令啟動mysql服務。
這時候通過上面的conn1對象,已經連接到數據庫上,但是要操作數據庫,還需要創建游標。
通過數據庫連接對象的cursor方法來創建游標。
 1 #導入MySQLdb模塊
 2 import MySQLdb
 3 
 4 #建立與數據庫的連接
 5 conn1=MySQLdb.connect(host='localhost'      #主機名
 6                       ,port=3306            #端口
 7                       ,user='root'          #用戶名
 8                       ,passwd='admin'       #密碼
 9                       ,db='test123'         #數據庫名
10                       )
11 #也可以簡寫成conn1=MySQLdb.connect('localhost','root','admin','test123')
12 
13 #創建游標
14 cur1=conn1.cursor()
15 
16 #對游標對象使用execute方法就可以執行普通的SQL語句
17 #做一次查詢
18 cur1.execute('select * from table_a limit 5')
19 
20 #通過fetchall方法獲取全部查詢結果
21 result1=cur1.fetchall()
22 print result1
23 
24 #通過fetchone方法獲取一條查詢結果
25 result2=cur1.fetchone()
26 print result2
27 
28 #關閉游標
29 cur1.close()
30 
31 #斷開數據庫連接
32 conn1.close()

執行結果:

 

說明:打印的result1結果應當是五條記錄,可以看出,通過fetchall()方法接收的查詢結果被保存為元組,而元組的每一個元素代表一條記錄,各個字段之間也組成了一個元組。

為什么打印的result2結果為None,這是因為,通過fetchall()方法進行結果獲取時,游標已移到結果集末尾,這時候通過fetchone()方法獲取記錄時自然是空值。

在進行完數據庫操作后,應當通過close方法關閉游標、斷開數據庫連接。
上面的例子簡單的介紹了導入模塊、建立連接、創建游標、執行SQL、顯示查詢結果集、斷開連接等一些基本的通過python對mysql進行操作的方法和步驟。
下面將具體進行介紹。
 
4、創建表:
 1 #導入MySQLdb模塊
 2 import MySQLdb
 3 
 4 #建立與數據庫的連接
 5 conn2=MySQLdb.connect('localhost','root','admin','test123')
 6 
 7 #創建游標
 8 cur2=conn2.cursor()
 9 
10 #創建表table_d,如果已經存在,則先刪除
11 cur2.execute('drop table if exists table_d')
12 
13 #編寫創建表的SQL語句
14 #當字符串很長,並且需要跨多行時,可以使用三個單引號/雙引號括起來
15 sql1="""create table table_d(std_id int not null
16                             ,std_name char(20)
17                             ,age int
18                             ,sex char(1)
19                             )"""
20 
21 #創建表
22 cur2.execute(sql1)
23 
24 #查看是否創建成功
25 cur2.execute('show tables')
26 result1=cur2.fetchall()
27 print result1
28 
29 #提交數據庫執行
30 conn2.commit()
31 
32 #關閉游標
33 cur2.close()
34 
35 #斷開數據庫連接
36 conn2.close()

 執行結果:

 

說明:其中需要注意一點,通過游標對象的execute函數執行SQL時,有兩種方式,一種是直接將SQL語句作為參數,另一種則是先創建一個字符串變量,其值為SQL語句,將該變量作為execute函數的參數。

 
5、查詢操作:
fetchall()用於接收全部的查詢結果集,返回一個元組,元組內一條元素代表一條記錄,一個元素本身又是一個元組。
fetchone()用於接收一條結果記錄。
rowcount()返回這次execute()操作影響的行數。
舉例:下面要就那些這樣一個查詢操作:
 
在mysql里面的查詢結果是:
 
下面在python里進行實現:
 1 #導入MySQLdb模塊
 2 import MySQLdb
 3 
 4 #建立與數據庫的連接
 5 conn3=MySQLdb.connect('localhost','root','admin','test123')
 6 
 7 #創建游標
 8 cur3=conn3.cursor()
 9 
10 #創建表
11 cur3.execute('select * from table_a where user_id=988917 and month_id=201503')
12 
13 #接收一條查詢結果
14 result1=cur3.fetchone()
15 print result1
16 
17 #接收全部查詢結果
18 result2=cur3.fetchall()
19 print result2
20 
21 #返回這次execute操作影響的記錄數
22 print cur3.rowcount
23 
24 #循環遍歷結果集記錄
25 for row in result2:
26     user_id=row[0]
27     month_id=row[1]
28     brand_id=row[2]
29     rate=row[3]
30     print 'user_id=%d,month_id=%d,brand_id=%s,rate=%f' % \
31           (user_id,month_id,brand_id,rate)
32     
33 #關閉游標
34 cur3.close()
35 
36 #斷開數據庫連接
37 conn3.close()

 執行結果:

 

說明:這個查詢的結果集應該是4條記錄,由於首先使用了fetchone方法,因此,獲取一條記錄后游標移動到下一條記錄的開頭,所以再使用fetchall方法時就只能獲取剩下的全部三條記錄。

注意,不論是fetchone方法還是fetchall方法,最后返回的都是元組。
還有另外兩種方法,fetchmany()和scroll(),前者可以指定獲取多少條查詢結果,后者可以用來移動游標。
 1 #導入MySQLdb模塊
 2 import MySQLdb
 3 
 4 #建立與數據庫的連接
 5 conn6=MySQLdb.connect('localhost','root','admin','test123')
 6 
 7 #創建游標
 8 cur6=conn6.cursor()
 9 
10 #創建表
11 cur6.execute('select * from table_a where user_id=988917 and month_id=201503')
12 
13 #返回這次execute操作影響的記錄數
14 print cur6.rowcount
15 
16 #接收全部查詢結果
17 result1=cur6.fetchall()
18 print result1
19 
20 #再次接收全部查詢結果
21 result2=cur6.fetchall()
22 print result2
23 
24 #游標移動到結果集開始位置
25 cur6.scroll(0,'absolute')       #絕對移動
26 
27 #取出一條記錄
28 result3=cur6.fetchone()
29 print result3
30 
31 #游標向后移動一條記錄
32 cur6.scroll(1,'relative')       #相當移動,也是缺省移動方式,可以縮寫為cur6.scroll(1)
33 
34 #取出兩條記錄
35 result4=cur6.fetchmany(2)
36 print result4
37 
38 #關閉游標
39 cur6.close()
40 
41 #斷開數據庫連接
42 conn6.close()

執行結果:

 

說明:查詢出4條記錄,第一次使用fetchall()取出了全部記錄,游標也相應的從結果集開始位置移動到結果集末尾,所以第二次使用fetchall()取出的就是空值,使用scroll()方法將游標移動到文件開始位置(位置0處,第一條查詢結果記錄編號為0,第二條編號為1,以此類推),再使用fetchone()就可以獲取一條記錄,這時候游標就移動到位置1處。再使用scroll()方法向后移動一個位置,游標到位置2處,這時候再使用fetchmany()方法取出2條記錄。

注意scroll方法有兩個參數,scroll(value,mode),mode缺省值為'relative',代表相對移動。當mode='relative'時,value就是移動的長度,value>0向后移動(從位置0移動到位置2),value<0向前移動(比如從位置2移動到位置0),當mode='absolute'時,代表絕對移動,value就代表移動的絕對位置,value=0就代表移動到位置0處,就是結果集開頭,value=3就是移動到位置3處,也就是第4條記錄處。
 
6、插入操作:
 1 #導入MySQLdb模塊
 2 import MySQLdb
 3 
 4 #建立與數據庫的連接
 5 conn4=MySQLdb.connect('localhost','root','admin','test123')
 6 
 7 #創建游標
 8 cur4=conn4.cursor()
 9 
10 #創建表table_e,如果已經存在,則先刪除
11 cur4.execute('drop table if exists table_e')
12 
13 #創建表table_e
14 sql1="""create table table_e(user_id int not null
15                             ,month_id int
16                             ,brand_id varchar(20)
17                             ,rate float
18                             )"""
19 cur4.execute(sql1)
20 
21 #插入一條數據
22 cur4.execute("insert into table_e values(999999,201505,'202B303',0.6752)")
23 
24 #驗證是否插入成功
25 cur4.execute('select * from table_e')
26 result1=cur4.fetchall()
27 print result1
28 
29 #再次插入一條記錄[使用%s占位]
30 sql2="insert into table_e values(%s,%s,%s,%s)"
31 cur4.execute(sql2,(888888,201505,'303B202',0.6565))
32 
33 #驗證是否插入成功
34 cur4.execute('select * from table_e')
35 result2=cur4.fetchall()
36 print result2
37 
38 #批量插入多條數據[每一個values作為一個元組,values共同組成一個列表,作為executemany的參數]
39 cur4.executemany(sql2,[
40                     (666666,201505,'101B101',0.5000)
41                     ,(666666,201505,'202B202',0.7656)
42                     ,(666666,201505,'303B303',0.8965)
43                     ]
44                     )
45 
46 #驗證是否插入成功
47 cur4.execute('select * from table_e')
48 result3=cur4.fetchall()
49 print result3
50 
51 #提交到數據庫執行
52 conn4.commit()
53 
54 #關閉游標
55 cur4.close()
56 
57 #斷開數據庫連接
58 conn4.close()

執行結果:

說明:插入單條數據有兩種寫法,但都使用的是execute方法,而插入批量數據使用的是executemany方法。

一定要使用數據庫連接對象的commit方法來提交插入,否則不能真正的插入數據。
 
7、更新操作: 
 1 #導入MySQLdb模塊
 2 import MySQLdb
 3 
 4 #建立與數據庫的連接
 5 conn5=MySQLdb.connect('localhost','root','admin','test123')
 6 
 7 #創建游標
 8 cur5=conn5.cursor()
 9 
10 #更新前
11 sql1="select * from table_e where user_id=888888"
12 cur5.execute(sql1)
13 result1=cur5.fetchall()
14 print result1
15 
16 #update語句
17 sql2="update table_e set rate=0.9988 where user_id=888888"
18 try:
19     cur5.execute(sql2)
20     print cur5.rowcount
21     conn5.commit()           #向數據庫中提交
22 except:
23     conn5.rollback()         #發生錯誤時回滾
24 
25 #驗證是否更新成功
26 sql3="select * from table_e where user_id=888888"
27 cur5.execute(sql3)
28 result2=cur5.fetchall()
29 print result2
30 
31 #關閉游標
32 cur5.close()
33 
34 #斷開數據庫連接
35 conn5.close()

執行結果:

 

說明:一定要使用數據庫連接對象的commit方法來提交更新,否則不能真正的更新數據。

 
8、刪除操作:
delete操作和drop操作類似於上面例子中形式,最后都是需要commit方法進行提交更改。最后關閉游標、斷開數據庫連接。
 
9、commit()與rollback()方法:
在關系型數據庫中通過事務機制來確保數據一致性。
事務應該具有4個屬性:原子性、一致性、隔離性、持久性。(ACID特性)
①原子性:atomicity,一個事物是一個不可分割的工作單位,事務內的操作要么都做要么都不做。
②一致性:consistency,事務必須是使數據庫從一個一致性狀態編導另一個一致性狀態。
③隔離性:isolation,一個事務的執行不能被其他事務干擾,即一個事物內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
④持久性:durability,一個事務一旦提交,它對數據庫中數據的改變就是永久性的。接下來的其他操作或者故障不應該對其有任何影響。
Python DB API 2.0 的事務提供了兩個方法 commit 或 rollback。
對於支持事務的數據庫, 在Python數據庫編程中,當游標建立之時,就自動開始了一個隱形的數據庫事務。
commit()方法:提交游標的所有更新操作。
rollback()方法:回滾當前游標的所有操作。
 
 
參考資料:
感謝。
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM