python中MySQLdb模塊用法實例

轉載自:http://www.jb51.net/article/57290.htm

姓名:梅金波? ? ? ? ? ? ? ? ? ? ? ? 學號:16010110036

【嵌牛導讀】MySQLdb其實有點像php或asp中連接數據庫的一個模式了乘碑,只是MySQLdb是針對mysql連接了接口罢维,我們可以在python中連接MySQLdb來實現(xiàn)數據的各種操作。

【嵌牛鼻子】MySQLdb模塊的用法實例共屈。

【嵌牛提問】python中的MySQLdb模塊如何使用唠摹?

【嵌牛正文】python連接mysql的方案有oursql花吟、PyMySQL萄喳、 myconnpy洞焙、MySQL Connector 等寒矿,不過本篇要說的確是另外一個類庫MySQLdb突琳,MySQLdb 是用于Python鏈接Mysql數據庫的接口,它實現(xiàn)了 Python 數據庫 API 規(guī)范 V2.0劫窒,基于 MySQL C API 上建立的本今。可以從:https://pypi.python.org/pypi/MySQL-python 進行獲取和安裝,而且很多發(fā)行版的linux源里都有該模塊冠息,可以直接通過源安裝挪凑。

一、數據庫連接

MySQLdb提供了connect方法用來和數據庫建立連接,接收數個參數,返回連接對象:

conn=MySQLdb.connect(host="localhost",user="root",passwd="jb51",db="test",charset="utf8")

比較常用的參數包括:

host:數據庫主機名.默認是用本地主機

user:數據庫登陸名.默認是當前用戶

passwd:數據庫登陸的秘密.默認為空

db:要使用的數據庫名.沒有默認值

port:MySQL服務使用的TCP端口.默認是3306

charset:數據庫編碼

更多關于參數的信息可以查這里 http://mysql-python.sourceforge.net/MySQLdb.html

然后,這個連接對象也提供了對事務操作的支持,標準的方法:

commit() 提交

rollback() 回滾

看一個簡單的查詢示例如下:

#!/usr/bin/python

# encoding: utf-8

import MySQLdb

# 打開數據庫連接

db = MySQLdb.connect("localhost","root","361way","test" )

# 使用cursor()方法獲取操作游標

cursor = db.cursor()

# 使用execute方法執(zhí)行SQL語句

cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法獲取一條數據庫逛艰。

data = cursor.fetchone()print "Database version : %s " % data

# 關閉數據庫連接

db.close()

腳本執(zhí)行結果如下:Database version : 5.5.40

二躏碳、cursor方法執(zhí)行與返回值

cursor方法提供兩類操作:1.執(zhí)行命令,2.接收返回值 散怖。

1.cursor用來執(zhí)行命令的方法

//用來執(zhí)行存儲過程,接收的參數為存儲過程名和參數列表,返回值為受影響的行數

callproc(self, procname, args)

//執(zhí)行單條sql語句,接收的參數為sql語句本身和使用的參數列表,返回值為受影響的行數

execute(self, query, args)

//執(zhí)行單挑sql語句,但是重復執(zhí)行參數列表里的參數,返回值為受影響的行數

executemany(self, query, args)

//移動到下一個結果集

nextset(self)

2.cursor用來接收返回值的方法

//接收全部的返回結果行.

fetchall(self)

//接收size條返回結果行.如果size的值大于返回的結果行的數量,則會返回cursor.arraysize條數據

fetchmany(self, size=None)

//返回一條結果行

fetchone(self)

//移動指針到某一行.如果mode=’relative’,則表示從當前所在行移動value條,如果mode=’absolute’,則表示從結果集的第一行移動value條

scroll(self, value, mode=’relative’)

//這是一個只讀屬性菇绵,并返回執(zhí)行execute()方法后影響的行數

rowcount

三、數據庫操作

1镇眷、創(chuàng)建database tables

如果數據庫連接存在我們可以使用execute()方法來為數據庫創(chuàng)建表咬最,如下所示創(chuàng)建表EMPLOYEE:

#!/usr/bin/python

# encoding: utf-8

import MySQLdb

# 打開數據庫連接

db = MySQLdb.connect("localhost","root","361way","test" )

# 使用cursor()方法獲取操作游標

cursor = db.cursor()

# 如果數據表已經存在使用 execute() 方法刪除表。

cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# 創(chuàng)建數據表SQL語句

sql = """CREATE TABLE EMPLOYEE (

? ? ? ? FIRST_NAME? CHAR(20) NOT NULL,

? ? ? ? LAST_NAME? CHAR(20),

? ? ? ? AGE INT,

? ? ? ? SEX CHAR(1),

? ? ? ? INCOME FLOAT )"""

cursor.execute(sql)

# 關閉數據庫連接

db.close()

2欠动、數據庫插入操作

#!/usr/bin/python

# encoding: utf-8

import MySQLdb

# 打開數據庫連接

db = MySQLdb.connect("localhost","root","361way","test" )

# 使用cursor()方法獲取操作游標

cursor = db.cursor()

# SQL 插入語句

sql = """INSERT INTO EMPLOYEE(FIRST_NAME,

? ? ? ? LAST_NAME, AGE, SEX, INCOME)

? ? ? ? VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""

try:?

# 執(zhí)行sql語句

? cursor.execute(sql)

# 提交到數據庫執(zhí)行

? db.commit()

except:

# Rollback in case there is any error

? db.rollback()

# 關閉數據庫連接

db.close()

這里是一個單sql 執(zhí)行的示例永乌,cursor.executemany的用法感興趣的讀者可以參看相關的aws主機資產管理系統(tǒng)示例。

上例也可以寫成通過占位符傳參的方式進行執(zhí)行具伍,如下:

#!/usr/bin/python

# encoding: utf-8

import MySQLdb

# 打開數據庫連接

db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法獲取操作游標

cursor = db.cursor()

# SQL 插入語句

sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \

? ? ? LAST_NAME, AGE, SEX, INCOME) \

? ? ? VALUES ('%s', '%s', '%d', '%c', '%d' )" % \

? ? ? ('Mac', 'Mohan', 20, 'M', 2000)

try:

# 執(zhí)行sql語句

? cursor.execute(sql)

# 提交到數據庫執(zhí)行

? db.commit()

except:

# 發(fā)生錯誤時回滾

? db.rollback()

# 關閉數據庫連接

db.close()

也可以以變量的方式傳遞參數翅雏,如下:

user_id = "test"

password = "password123"

con.execute('insert into Login values("%s", "%s")' % \

? ? ? ? ? ? (user_id, password))

3、數據庫查詢操作

以查詢EMPLOYEE表中salary(工資)字段大于1000的所有數據為例:

#!/usr/bin/python

# encoding: utf-8

import MySQLdb

# 打開數據庫連接

db = MySQLdb.connect("localhost","root","361way","test" )# 使用cursor()方法獲取操作游標cursor = db.cursor()# SQL 查詢語句sql = "SELECT * FROM EMPLOYEE \

? ? ? WHERE INCOME > '%d'" % (1000)

try:

# 執(zhí)行SQL語句

? cursor.execute(sql)

# 獲取所有記錄列表

? results = cursor.fetchall()

? for row in results:

? ? ? fname = row[0]

? ? ? lname = row[1]

? ? ? age = row[2]

? ? ? sex = row[3]

? ? ? income = row[4]

# 打印結果

? ? ? print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \

? ? ? ? ? ? (fname, lname, age, sex, income )

except:

? print "Error: unable to fecth data"

# 關閉數據庫連接

db.close()

以上腳本執(zhí)行結果如下:

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

4人芽、數據庫更新操作

更新操作用于更新數據表的的數據望几,以下實例將 test表中的 SEX 字段全部修改為 ‘M’,AGE 字段遞增1:

# encoding: utf-8

#!/usr/bin/python

import MySQLdb

# 打開數據庫連接

db = MySQLdb.connect("localhost","root","361way","test" )

# 使用cursor()方法獲取操作游標

cursor = db.cursor()

# SQL 更新語句

sql = "UPDATE EMPLOYEE SET AGE = AGE + 1? WHERE SEX = '%c'" % ('M')

try:?

# 執(zhí)行SQL語句

? cursor.execute(sql)? # 提交到數據庫執(zhí)行

? db.commit()

except:

# 發(fā)生錯誤時回滾

? db.rollback()

# 關閉數據庫連接

db.close()

5萤厅、執(zhí)行事務

事務機制可以確保數據一致性橄抹。

事務應該具有4個屬性:原子性、一致性祈坠、隔離性害碾、持久性矢劲。這四個屬性通常稱為ACID特性赦拘。

① 原子性(atomicity)。一個事務是一個不可分割的工作單位芬沉,事務中包括的諸操作要么都做躺同,要么都不做。

② 一致性(consistency)丸逸。事務必須是使數據庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)蹋艺。一致性與原子性是密切相關的。

③ 隔離性(isolation)黄刚。一個事務的執(zhí)行不能被其他事務干擾捎谨。即一個事務內部的操作及使用的數據對并發(fā)的其他事務是隔離的,并發(fā)執(zhí)行的各個事務之間不能互相干擾。

④ 持久性(durability)涛救。持續(xù)性也稱永久性(permanence)畏邢,指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的检吆。接下來的其他操作或故障不應該對其有任何影響舒萎。

Python DB API 2.0 的事務提供了兩個方法 commit 或 rollback。實例:

# SQL刪除記錄語句

sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)

try:

# 執(zhí)行SQL語句

? cursor.execute(sql)

# 向數據庫提交

? db.commit()

except:

# 發(fā)生錯誤時回滾

? db.rollback()

對于支持事務的數據庫蹭沛, 在Python數據庫編程中臂寝,當游標建立之時,就自動開始了一個隱形的數據庫事務摊灭。commit()方法游標的所有更新操作咆贬,rollback()方法回滾當前游標的所有操作。每一個方法都開始了一個新的事務帚呼。

希望本文所述對大家的Python程序設計有所幫助素征。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萝挤,隨后出現(xiàn)的幾起案子御毅,更是在濱河造成了極大的恐慌,老刑警劉巖怜珍,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端蛆,死亡現(xiàn)場離奇詭異,居然都是意外死亡酥泛,警方通過查閱死者的電腦和手機今豆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柔袁,“玉大人呆躲,你說我怎么就攤上這事〈匪鳎” “怎么了插掂?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腥例。 經常有香客問我辅甥,道長,這世上最難降的妖魔是什么燎竖? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任璃弄,我火速辦了婚禮,結果婚禮上构回,老公的妹妹穿的比我還像新娘夏块。我一直安慰自己疏咐,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布脐供。 她就那樣靜靜地躺著凳鬓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪患民。 梳的紋絲不亂的頭發(fā)上缩举,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音匹颤,去河邊找鬼仅孩。 笑死,一個胖子當著我的面吹牛印蓖,可吹牛的內容都是我干的辽慕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赦肃,長吁一口氣:“原來是場噩夢啊……” “哼溅蛉!你這毒婦竟也來了?” 一聲冷哼從身側響起他宛,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤船侧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厅各,有當地人在樹林里發(fā)現(xiàn)了一具尸體镜撩,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年队塘,在試婚紗的時候發(fā)現(xiàn)自己被綠了袁梗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡憔古,死狀恐怖遮怜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鸿市,我是刑警寧澤锯梁,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站灸芳,受9級特大地震影響涝桅,放射性物質發(fā)生泄漏拜姿。R本人自食惡果不足惜烙样,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蕊肥。 院中可真熱鬧谒获,春花似錦蛤肌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赔硫,卻和暖如春炒俱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爪膊。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工权悟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人推盛。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓峦阁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耘成。 傳聞我的和親對象是個殘疾皇子榔昔,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容