天天看點

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 reCount
conn.commit()  
cur.close()
conn.close()           

複制

這段代碼有點資料庫基礎的的就可以看懂,其實就是在cur.execute()方法的括号裡寫入要執行的sql語句就好了。

如果有多條語句需要插入,最簡單的使用for循環的方式插入資料。但是子產品自帶了executemany方法可以更加友善的實作多條語句同時插入的功能

import MySQLdb
conn = 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 MySQLdb
conn = 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 MySQLdb
conn = 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 MySQLdb
conn = 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 MySQLdb
conn = 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寫的不行其他的都白瞎了