標籤:python mysqldb
用python操作mysql資料庫,就會用到MySQLdb模組,這個模組其實和檔案資料庫SQLite的操作方式一樣的
先來看一下這模組的簡單實用
插入資料
import MySQLdb#建立一個mysql的連線物件 conn = MySQLdb.connect(host=‘127.0.0.1‘,user=‘root‘,passwd=‘1234‘,db=‘mydb‘)#建立操作遊標,一切對資料庫的操作都是調用遊標裡的方法 cur = conn.cursor()"""這裡要注意,和其他模組不同的就是value裡面參數的預留位置,在mysql裡面不管要value的值是什麼類型,預留位置只有%s一種模式。這要切記~~!! """ reCount =cur.execute(‘insert into UserInfo(Name,age) values(%s,%s)‘,(‘alex‘,18))#執行插入語句會返回成功插入的條目數。可以將這個條目數列印出來print reCountconn.commit() cur.close()conn.close()
這段代碼有點資料庫基礎的的就可以看懂,其實就是在cur.execute()方法的括弧裡寫入要執行的sql語句就好了。
如果有多條語句需要插入,最簡單的使用for迴圈的方式插入資料。但是模組內建了executemany方法可以更加方便的實現多條語句同時插入的功能
import MySQLdbconn = MySQLdb.connect(host=‘127.0.0.1‘,user=‘root‘,passwd=‘1234‘,db=‘mydb‘)cur = conn.cursor()#以元組為單位,存入要插入的values值li =[ (‘alex‘,‘usa‘), (‘sb‘,‘usa‘),]#這裡改成調用executemany()方法一次操作多條資料reCount = cur.executemany(‘insert into UserInfo(Name,Address) values(%s,%s)‘,li)conn.commit()cur.close()conn.close()print reCount
查詢操作是我們最常用的資料庫操作,模組也為我們提供了很多選項
查詢操作
import MySQLdbconn = MySQLdb.connect(host=‘192.168.10.105‘,user=‘wgw‘,passwd=‘123456‘,db=‘wgwtest‘)cur = conn.cursor()reCount = cur.execute(‘select * from user_list‘)#通過fetchone方法擷取一條結果print cur.fetchone()print ‘select %s lins‘%reCount
上面的代碼執行結果是
(1L, 1L, ‘wgw‘, ‘123456‘, 0L)select 3 lins
返回的統計結果是查詢到了3條資料,我們只獲得了一條。這是怎麼回事?這是因為我們使用了fetchone方法。這個方法不管查詢了多少條資料,它只取第一條。另外我們看到查詢結果裡面的有很多的L,這個L是表示我們查詢出來的數字類型是Long int 長整形的。
那如果我們要擷取所有的查詢結果怎麼辦呢?那就用fetchall()方法
#!/usr/bin/env python# -*-coding:utf-8-*-import MySQLdbconn = MySQLdb.connect(host=‘192.168.10.105‘,user=‘wgw‘,passwd=‘123456‘,db=‘wgwtest‘)cur = conn.cursor()reCount = cur.execute(‘select * from user_list‘)#通過fetchall方法擷取全部結果print cur.fetchall()print ‘select %s lins‘%reCount
這次的執行結果如下
((1L, 1L, ‘wgw‘, ‘123456‘, 0L), (2L, 2L, ‘alex‘, ‘123456‘, 1L), (3L, 3L, ‘eric‘, ‘123456‘, 0L))select 3 lins
這樣就查詢出來了所有資料條目,fetchall的運行結果是用一個大的元組包含了所有的資料條目,其中每一個資料條目都用一個小元組表示。但是這種元組套元組的方式也很麻煩。比如我們要取使用者名稱的欄位值,那需要對元組的內容進行切片,先切大的再切小的。是不是很麻煩?這個我們也有辦法解決。問題就是處在遊標對象身上
我們建立遊標的對象的時候用的語句是
cur = conn.cursor()
這種模式,預設擷取的結果都以元組形式展現。我們現在換一種建立對象的方法
cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
這種方式指定了遊標以字典的形式返回資料,我們來看看效果。
先看看fetchone
#!/usr/bin/env python# -*-coding:utf-8-*-import MySQLdbconn = MySQLdb.connect(host=‘192.168.10.105‘,user=‘wgw‘,passwd=‘123456‘,db=‘wgwtest‘)#cur = conn.cursor()#指定遊標的資料傳回型別cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)reCount = cur.execute(‘select * from user_list‘)#通過fetchall方法擷取全部結果print cur.fetchall()print ‘select %s lines‘%reCount
運行結果如下
{‘tid‘: 1L, ‘passwd‘: ‘123456‘, ‘login_count‘: 0L, ‘uid‘: 1L, ‘name‘: ‘wgw‘}select 3 lines
返回的查詢結果變成字典形式了,字典的key就是欄位名稱,value就是我們查詢的欄位值。這樣我們通過fetchone[‘name‘]這可以獲得使用者名稱。別切片方式省事多了
再看看fetchall的效果
#!/usr/bin/env python# -*-coding:utf-8-*-import MySQLdbconn = MySQLdb.connect(host=‘192.168.10.105‘,user=‘wgw‘,passwd=‘123456‘,db=‘wgwtest‘)#cur = conn.cursor()#指定遊標的資料傳回型別cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)reCount = cur.execute(‘select * from user_list‘)#通過fetchall方法擷取全部結果print cur.fetchall()print ‘select %s lines‘%reCount
運行結果如下:
({‘tid‘: 1L, ‘passwd‘: ‘123456‘, ‘login_count‘: 0L, ‘uid‘: 1L, ‘name‘: ‘wgw‘}, {‘tid‘: 2L, ‘passwd‘: ‘123456‘, ‘login_count‘: 1L, ‘uid‘: 2L, ‘name‘: ‘alex‘}, {‘tid‘: 3L, ‘passwd‘: ‘123456‘, ‘login_count‘: 0L, ‘uid‘: 3L, ‘name‘: ‘eric‘})select 3 lines
看結果每個資料條目的內容已經用字典表示了,但是fetchall()方法還是會在結果最外層加個元組封裝。這是沒辦法的事情了,但那也比最原始的模式要好操作的多。
使用MySQLdb模組,個人的感覺就3點
1、遊標的擷取類型指定為字典類型
2、如果查詢結果只有一條就用fetchone()方法,這樣可以少處理一層元組
3、好好學學資料庫SQL語言,這個模組的核心還是調用資料庫的SQL實現的。SQL寫的不行其他的都白瞎了
本文出自 “霹靂豆包” 部落格,謝絕轉載!
python MySQLdb 模組