python中MySQLdb模塊用法實例

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

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

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

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

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

【嵌牛正文】python連接mysql的方案有oursql、PyMySQL、 myconnpy、MySQL Connector 等,不過本篇要說的確是另外一個類庫MySQLdb,MySQLdb 是用于Python鏈接Mysql數據庫的接口,它實現了 Python 數據庫 API 規范 V2.0,基于 MySQL C API 上建立的。可以從:https://pypi.python.org/pypi/MySQL-python 進行獲取和安裝,而且很多發行版的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方法執行SQL語句

cursor.execute("SELECT VERSION()")

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

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

# 關閉數據庫連接

db.close()

腳本執行結果如下:Database version : 5.5.40

二、cursor方法執行與返回值

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

1.cursor用來執行命令的方法

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

callproc(self, procname, args)

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

execute(self, query, args)

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

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’)

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

rowcount

三、數據庫操作

1、創建database tables

如果數據庫連接存在我們可以使用execute()方法來為數據庫創建表,如下所示創建表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")

# 創建數據表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:?

# 執行sql語句

? cursor.execute(sql)

# 提交到數據庫執行

? db.commit()

except:

# Rollback in case there is any error

? db.rollback()

# 關閉數據庫連接

db.close()

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

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

#!/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:

# 執行sql語句

? cursor.execute(sql)

# 提交到數據庫執行

? db.commit()

except:

# 發生錯誤時回滾

? 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:

# 執行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()

以上腳本執行結果如下:

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:?

# 執行SQL語句

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

? db.commit()

except:

# 發生錯誤時回滾

? db.rollback()

# 關閉數據庫連接

db.close()

5、執行事務

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

事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。

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

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

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

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

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

# SQL刪除記錄語句

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

try:

# 執行SQL語句

? cursor.execute(sql)

# 向數據庫提交

? db.commit()

except:

# 發生錯誤時回滾

? db.rollback()

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容