13 python 之 mysqldb 庫的使用
Python實戰-從菜鳥到大牛的進階之路 作者:極客學院 投票推薦 加入書簽 留言反饋
在開發的過程中避免不了和數據庫的交互,在實際環境中用的最多的 mysql 數據庫,那 python 是怎麽和 mysql 進行交互的呢,python 使用一個叫 mysqldb 的庫來連接 mysql,好的,下麵最要從 mysqldb 的安裝、連接 mysql、執行 sql 語句、如何取得結果、關閉數據庫連接來講述一下: <ol><li>mysqldb 的安裝</li></ol>
我使用的是 ubuntu 係統,安裝方法為:apt-get install python-mysqldb,這樣當在 python 環境執行 import mysqldb 不報錯就是安
root@ubuntu:~# pythonpython 2.7.4 (default, apr 19 2013, 18:32:33)[ 4.7.3] on linux2type "help", "copyright", "credits" or "license" for more information.>>> import mysqldb>>> </pre><ol><li>如何連接 mysql</li></ol>
mysqldb 提供的 connect 方法用來和數據庫建立連接,接收數個參數,返回連接對象,如:
conn=mysqldb.connect(host="localhost",user="root",passwd="sa",db="mytable",port=3306) </pre>
比較常用的參數包括:
host:數據庫主機名.默認是用本地主機.
user:數據庫登陸名.默認是當前用戶.
passwd:數據庫登陸的秘密.默認為空.
db:要使用的數據庫名.沒有默認值,如果在這裏設置了 db,則連接時直接連接到 mysql 的 db 設置的數據庫中
port:mysql服務使用的tcp端口.默認是3306.
注:connect 中的 host、user、passwd 等可以不寫,隻有在寫的時候按照 host、user、passwd、db(可以不寫)、port 順序寫就可以,注意端口號 port=3306 還是不要省略的為好,如果沒有 db 在 port 前麵,直接寫 3306 會報錯
連接成功後,如需切換該用戶的其他數據庫,使用以下語句:conn.select_db(\''mysql\'')形式切換數據庫
>>> con=mysqldb.connect(\''localhost\'',\''root\'',\''123456\'',port=3306)>>> con.select_db(\''mysql\'')>>> cur=con.cursor>>> cur.execute(\''show tables\'')24l>>> cur.fetchall((\''columns_priv\'',), (\''db\'',), (\''event\'',), (\''func\'',), (\''general_log\'',), (\''help_category\'',), (\''help_keyword\'',), (\''help_rtion\'',), (\''help_topic\'',), (\''host\'',), (\''ndb_binlog_index\'',), (\''plugin\'',), (\''proc\'',), (\''procs_priv\'',), (\''proxies_priv\'',), (\''servers\'',), (\''slow_log\'',), (\''tables_priv\'',), (\''time_zone\'',), (\''time_zone_leap_second\'',), (\''time_zone_name\'',), (\''time_zone_transition\'',), (\''time_zone_transition_type\'',), (\''user\'',)) </pre>
第 1 行:連接數據庫
第 2 行:選擇連接 mysql 這個數據庫
第 3 行以下是獲取數據庫表,語法後麵會講 <ol><li>怎麽操作數據庫,mysqldb 用遊標(指針)cursor 的方式操作數據庫</li></ol>
因該模塊底層其實是調用 c api 的,所以,需要先得到當前指向數據庫的指針
>>> cur=con.cursor </pre><ol><li>數據庫的操作和結果顯示</li></ol>
我們利用 cursor 提供的方法來進行操作,方法主要是 1.執行命令 2.接收結果
ursor 用來執行命令的方法:
execute(query, args):執行單條 sql 語句,接收的參數為 sql 語句本身和使用的參數列表,返回值為受影響的行數
executemany(query, args):執行單挑 sql 語句,但是重複執行參數列表裏的參數,返回值為受影響的行數
cursor 用來接收返回值的方法:
fetchall(self):接收全部的返回結果行.
fetchmany(size=none):接收 size 條返回結果行.如果 size 的值大於返回的結果行的數量,則會返回 cursor.arraysize 條數據.
fetchone:返回一條結果行.
scroll(value, mode=\''rtive\''):移動指針到某一行.如果 mode=\''rtive\'',則表示從當前所在行移動 value 條,如果 mode=\''absolute\'',則表示從結果集的第一行移動 value 條.
先來看一下 execute 的增刪改查的操作
#創建數據庫 51ctotest>>> cur.execute(\''create database 51ctotest\'') #選擇數據庫 51ctotest>>>con.select_db(\''51ctotest\'') #創建表 51cto,id 自增>>>cur.execute(\''create table if not exists 51cto(id int(11) primary key auto_increment,name varchar(20),age int(3))\'') #插入一行數據,隻給 name、age 賦值,讓 id 自增 #使用 sql 語句,這裏要接收的參數都用 %s 占位符.要注意的是,無論你要插入的數據是什 # 麽類型,占位符永遠都要用 %s,後麵的數值為元組或者列表>>>cur.execute("insert into 51cto(name,age) values(%s,%s)",(\''fan\'',25)) #插入多行數據,用 executemany,它會循環插入後麵元組中的所有值>>> cur.executemany("insert into 51cto(name,age) values(%s,%s)",((\''te\'',25),(\''fei\'',26),(\''musha\'',25)))3l #查詢>>> cur.execute(\''select * from 51cto\'')5l #我們使用了 fetchall 這個方法.這樣,cds 裏保存的將會是查詢返回的全部結果.每條結果都是一個 tuple 類型的數據,這些 tuple 組成了一個 tuple>>> cur.fetchall((1l, \''fan\'', 25l), (2l, \''fan\'', 25l), (3l, \''te\'', 25l), (4l, \''fei\'', 26l), (5l, \''musha\'', 25l)) #再次查詢,會看到查詢不到結果,因為無論 fetchone、fetchall、fetchmany 指針是會發生移動的。所以,若不重置指針,那麽使用 fetchall 的信息將隻會包含指針後麵的行內容。使用 fetchall 把指針挪到了最後,可以用 scroll 手動把指針挪到一個位置>>> cur.fetchall >>> cur.scroll(1,\''absolute\'')>>> for i in cur.fetchall:... print i ...(2l, \''fan\'', 25l)(3l, \''te\'', 25l)(4l, \''fei\'', 26l)(5l, \''musha\'', 25l) </pre>
這裏有必要說一下 scroll:
cur.scroll(int,parm) </pre>
這裏參數含義為:
int:移動的行數,整數;在相對模式下,正數向下移動,負值表示向上移動。
parm:移動的模式,默認 是 rtive,相對模式;可接受 absoulte,絕對模式。
#fetchone一次隻取一行,指針下移 fetchmany(size)一次去 size 行>>> cur.scroll(1,\''absolute\'')>>> cur.fetchone(2l, \''fan\'', 25l)>>> cur.fetchmany(2)((3l, \''te\'', 25l), (4l, \''fei\'', 26l)) #普通取出是元組的形式,再從裏麵取值不好取,那怎麽取成字典的格式呢,mysqldb 中有 dictcursor,要做到這點也很簡單,那就是建立數據庫連接是傳遞 cusorss 參數,或者在獲取 cursor 對象時傳遞 cusorss 參數即可>>> cur = con.cursor(cursorss=mysqldb.cursors.dictcursor) >>> cur.execute(\''select * from 51cto\'')5l>>> for i in cur.fetchall:... print i...{\''age\'': 25l, \''id\'': 2l, \''name\'': \''fan\''}{\''age\'': 25l, \''id\'': 3l, \''name\'': \''te\''}{\''age\'': 26l, \''id\'': 4l, \''name\'': \''fei\''}{\''age\'': 25l, \''id\'': 5l, \''name\'': \''musha\''} #更新,習慣 %s 的用法>>> cur.execute(\''update 51cto set name=%s where id=3\'',(\''mus\''))>>> cur.scroll(2,\''absolute\'')>>> cur.fetchone {\''age\'': 25l, \''id\'': 3l, \''name\'': \''mus\''} #在執行完插入或刪除或修改操作後,需要調用一下 connmit 方法進行提交.這樣,數據才會真正保 存在數據庫中>>> conmit #最後關閉遊標,關閉連接>>> cur.close>>> con.close </pre>
我使用的是 ubuntu 係統,安裝方法為:apt-get install python-mysqldb,這樣當在 python 環境執行 import mysqldb 不報錯就是安
root@ubuntu:~# pythonpython 2.7.4 (default, apr 19 2013, 18:32:33)[ 4.7.3] on linux2type "help", "copyright", "credits" or "license" for more information.>>> import mysqldb>>> </pre><ol><li>如何連接 mysql</li></ol>
mysqldb 提供的 connect 方法用來和數據庫建立連接,接收數個參數,返回連接對象,如:
conn=mysqldb.connect(host="localhost",user="root",passwd="sa",db="mytable",port=3306) </pre>
比較常用的參數包括:
host:數據庫主機名.默認是用本地主機.
user:數據庫登陸名.默認是當前用戶.
passwd:數據庫登陸的秘密.默認為空.
db:要使用的數據庫名.沒有默認值,如果在這裏設置了 db,則連接時直接連接到 mysql 的 db 設置的數據庫中
port:mysql服務使用的tcp端口.默認是3306.
注:connect 中的 host、user、passwd 等可以不寫,隻有在寫的時候按照 host、user、passwd、db(可以不寫)、port 順序寫就可以,注意端口號 port=3306 還是不要省略的為好,如果沒有 db 在 port 前麵,直接寫 3306 會報錯
連接成功後,如需切換該用戶的其他數據庫,使用以下語句:conn.select_db(\''mysql\'')形式切換數據庫
>>> con=mysqldb.connect(\''localhost\'',\''root\'',\''123456\'',port=3306)>>> con.select_db(\''mysql\'')>>> cur=con.cursor>>> cur.execute(\''show tables\'')24l>>> cur.fetchall((\''columns_priv\'',), (\''db\'',), (\''event\'',), (\''func\'',), (\''general_log\'',), (\''help_category\'',), (\''help_keyword\'',), (\''help_rtion\'',), (\''help_topic\'',), (\''host\'',), (\''ndb_binlog_index\'',), (\''plugin\'',), (\''proc\'',), (\''procs_priv\'',), (\''proxies_priv\'',), (\''servers\'',), (\''slow_log\'',), (\''tables_priv\'',), (\''time_zone\'',), (\''time_zone_leap_second\'',), (\''time_zone_name\'',), (\''time_zone_transition\'',), (\''time_zone_transition_type\'',), (\''user\'',)) </pre>
第 1 行:連接數據庫
第 2 行:選擇連接 mysql 這個數據庫
第 3 行以下是獲取數據庫表,語法後麵會講 <ol><li>怎麽操作數據庫,mysqldb 用遊標(指針)cursor 的方式操作數據庫</li></ol>
因該模塊底層其實是調用 c api 的,所以,需要先得到當前指向數據庫的指針
>>> cur=con.cursor </pre><ol><li>數據庫的操作和結果顯示</li></ol>
我們利用 cursor 提供的方法來進行操作,方法主要是 1.執行命令 2.接收結果
ursor 用來執行命令的方法:
execute(query, args):執行單條 sql 語句,接收的參數為 sql 語句本身和使用的參數列表,返回值為受影響的行數
executemany(query, args):執行單挑 sql 語句,但是重複執行參數列表裏的參數,返回值為受影響的行數
cursor 用來接收返回值的方法:
fetchall(self):接收全部的返回結果行.
fetchmany(size=none):接收 size 條返回結果行.如果 size 的值大於返回的結果行的數量,則會返回 cursor.arraysize 條數據.
fetchone:返回一條結果行.
scroll(value, mode=\''rtive\''):移動指針到某一行.如果 mode=\''rtive\'',則表示從當前所在行移動 value 條,如果 mode=\''absolute\'',則表示從結果集的第一行移動 value 條.
先來看一下 execute 的增刪改查的操作
#創建數據庫 51ctotest>>> cur.execute(\''create database 51ctotest\'') #選擇數據庫 51ctotest>>>con.select_db(\''51ctotest\'') #創建表 51cto,id 自增>>>cur.execute(\''create table if not exists 51cto(id int(11) primary key auto_increment,name varchar(20),age int(3))\'') #插入一行數據,隻給 name、age 賦值,讓 id 自增 #使用 sql 語句,這裏要接收的參數都用 %s 占位符.要注意的是,無論你要插入的數據是什 # 麽類型,占位符永遠都要用 %s,後麵的數值為元組或者列表>>>cur.execute("insert into 51cto(name,age) values(%s,%s)",(\''fan\'',25)) #插入多行數據,用 executemany,它會循環插入後麵元組中的所有值>>> cur.executemany("insert into 51cto(name,age) values(%s,%s)",((\''te\'',25),(\''fei\'',26),(\''musha\'',25)))3l #查詢>>> cur.execute(\''select * from 51cto\'')5l #我們使用了 fetchall 這個方法.這樣,cds 裏保存的將會是查詢返回的全部結果.每條結果都是一個 tuple 類型的數據,這些 tuple 組成了一個 tuple>>> cur.fetchall((1l, \''fan\'', 25l), (2l, \''fan\'', 25l), (3l, \''te\'', 25l), (4l, \''fei\'', 26l), (5l, \''musha\'', 25l)) #再次查詢,會看到查詢不到結果,因為無論 fetchone、fetchall、fetchmany 指針是會發生移動的。所以,若不重置指針,那麽使用 fetchall 的信息將隻會包含指針後麵的行內容。使用 fetchall 把指針挪到了最後,可以用 scroll 手動把指針挪到一個位置>>> cur.fetchall >>> cur.scroll(1,\''absolute\'')>>> for i in cur.fetchall:... print i ...(2l, \''fan\'', 25l)(3l, \''te\'', 25l)(4l, \''fei\'', 26l)(5l, \''musha\'', 25l) </pre>
這裏有必要說一下 scroll:
cur.scroll(int,parm) </pre>
這裏參數含義為:
int:移動的行數,整數;在相對模式下,正數向下移動,負值表示向上移動。
parm:移動的模式,默認 是 rtive,相對模式;可接受 absoulte,絕對模式。
#fetchone一次隻取一行,指針下移 fetchmany(size)一次去 size 行>>> cur.scroll(1,\''absolute\'')>>> cur.fetchone(2l, \''fan\'', 25l)>>> cur.fetchmany(2)((3l, \''te\'', 25l), (4l, \''fei\'', 26l)) #普通取出是元組的形式,再從裏麵取值不好取,那怎麽取成字典的格式呢,mysqldb 中有 dictcursor,要做到這點也很簡單,那就是建立數據庫連接是傳遞 cusorss 參數,或者在獲取 cursor 對象時傳遞 cusorss 參數即可>>> cur = con.cursor(cursorss=mysqldb.cursors.dictcursor) >>> cur.execute(\''select * from 51cto\'')5l>>> for i in cur.fetchall:... print i...{\''age\'': 25l, \''id\'': 2l, \''name\'': \''fan\''}{\''age\'': 25l, \''id\'': 3l, \''name\'': \''te\''}{\''age\'': 26l, \''id\'': 4l, \''name\'': \''fei\''}{\''age\'': 25l, \''id\'': 5l, \''name\'': \''musha\''} #更新,習慣 %s 的用法>>> cur.execute(\''update 51cto set name=%s where id=3\'',(\''mus\''))>>> cur.scroll(2,\''absolute\'')>>> cur.fetchone {\''age\'': 25l, \''id\'': 3l, \''name\'': \''mus\''} #在執行完插入或刪除或修改操作後,需要調用一下 connmit 方法進行提交.這樣,數據才會真正保 存在數據庫中>>> conmit #最後關閉遊標,關閉連接>>> cur.close>>> con.close </pre>