1、基本介紹:


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()方法獲取記錄時自然是空值。
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函數的參數。


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方法時就只能獲取剩下的全部三條記錄。

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條記錄。
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方法。
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方法來提交更新,否則不能真正的更新數據。