python中MySQLdb模塊用法實(shí)例
本文實(shí)例講述了python中MySQLdb模塊用法。分享給大家供大家參考。具體用法分析如下:
MySQLdb其實(shí)有點(diǎn)像php或asp中連接數(shù)據(jù)庫的一個(gè)模式了,只是MySQLdb是針對mysql連接了接口,我們可以在python中連接MySQLdb來實(shí)現(xiàn)數(shù)據(jù)的各種操作。
python連接mysql的方案有oursql、PyMySQL、 myconnpy、MySQL Connector 等,不過本篇要說的確是另外一個(gè)類庫MySQLdb,MySQLdb 是用于Python鏈接Mysql數(shù)據(jù)庫的接口,它實(shí)現(xiàn)了 Python 數(shù)據(jù)庫 API 規(guī)范 V2.0,基于 MySQL C API 上建立的??梢詮模篽ttps://pypi.python.org/pypi/MySQL-python 進(jìn)行獲取和安裝,而且很多發(fā)行版的linux源里都有該模塊,可以直接通過源安裝。
一、數(shù)據(jù)庫連接
MySQLdb提供了connect方法用來和數(shù)據(jù)庫建立連接,接收數(shù)個(gè)參數(shù),返回連接對象:
比較常用的參數(shù)包括:
host:數(shù)據(jù)庫主機(jī)名.默認(rèn)是用本地主機(jī)
user:數(shù)據(jù)庫登陸名.默認(rèn)是當(dāng)前用戶
passwd:數(shù)據(jù)庫登陸的秘密.默認(rèn)為空
db:要使用的數(shù)據(jù)庫名.沒有默認(rèn)值
port:MySQL服務(wù)使用的TCP端口.默認(rèn)是3306
charset:數(shù)據(jù)庫編碼
更多關(guān)于參數(shù)的信息可以查這里 http://mysql-python.sourceforge.net/MySQLdb.html
然后,這個(gè)連接對象也提供了對事務(wù)操作的支持,標(biāo)準(zhǔn)的方法:
commit() 提交
rollback() 回滾
看一個(gè)簡單的查詢示例如下:
# encoding: utf-8
import MySQLdb
# 打開數(shù)據(jù)庫連接
db = MySQLdb.connect("localhost","root","361way","test" )
# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()
# 使用execute方法執(zhí)行SQL語句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法獲取一條數(shù)據(jù)庫。
data = cursor.fetchone()
print "Database version : %s " % data
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
腳本執(zhí)行結(jié)果如下:
Database version : 5.5.40
二、cursor方法執(zhí)行與返回值
cursor方法提供兩類操作:1.執(zhí)行命令,2.接收返回值 。
cursor用來執(zhí)行命令的方法
callproc(self, procname, args)
//執(zhí)行單條sql語句,接收的參數(shù)為sql語句本身和使用的參數(shù)列表,返回值為受影響的行數(shù)
execute(self, query, args)
//執(zhí)行單挑sql語句,但是重復(fù)執(zhí)行參數(shù)列表里的參數(shù),返回值為受影響的行數(shù)
executemany(self, query, args)
//移動到下一個(gè)結(jié)果集
nextset(self)
cursor用來接收返回值的方法
//接收全部的返回結(jié)果行.
fetchall(self)
//接收size條返回結(jié)果行.如果size的值大于返回的結(jié)果行的數(shù)量,則會返回cursor.arraysize條數(shù)據(jù)
fetchmany(self, size=None)
//返回一條結(jié)果行
fetchone(self)
//移動指針到某一行.如果mode='relative',則表示從當(dāng)前所在行移動value條,如果mode='absolute',則表示從結(jié)果集的第一行移動value條
scroll(self, value, mode='relative')
//這是一個(gè)只讀屬性,并返回執(zhí)行execute()方法后影響的行數(shù)
rowcount
三、數(shù)據(jù)庫操作
1、創(chuàng)建database tables
如果數(shù)據(jù)庫連接存在我們可以使用execute()方法來為數(shù)據(jù)庫創(chuàng)建表,如下所示創(chuàng)建表EMPLOYEE:
# encoding: utf-8
import MySQLdb
# 打開數(shù)據(jù)庫連接
db = MySQLdb.connect("localhost","root","361way","test" )
# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()
# 如果數(shù)據(jù)表已經(jīng)存在使用 execute() 方法刪除表。
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 創(chuàng)建數(shù)據(jù)表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)
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
2、數(shù)據(jù)庫插入操作
# encoding: utf-8
import MySQLdb
# 打開數(shù)據(jù)庫連接
db = MySQLdb.connect("localhost","root","361way","test" )
# 使用cursor()方法獲取操作游標(biāo)
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)
# 提交到數(shù)據(jù)庫執(zhí)行
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
這里是一個(gè)單sql 執(zhí)行的示例,cursor.executemany的用法感興趣的讀者可以參看相關(guān)的aws主機(jī)資產(chǎn)管理系統(tǒng)示例。
上例也可以寫成通過占位符傳參的方式進(jìn)行執(zhí)行,如下:
# encoding: utf-8
import MySQLdb
# 打開數(shù)據(jù)庫連接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法獲取操作游標(biāo)
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)
# 提交到數(shù)據(jù)庫執(zhí)行
db.commit()
except:
# 發(fā)生錯(cuò)誤時(shí)回滾
db.rollback()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
也可以以變量的方式傳遞參數(shù),如下:
user_id = "test"
password = "password123"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................
3、數(shù)據(jù)庫查詢操作
以查詢EMPLOYEE表中salary(工資)字段大于1000的所有數(shù)據(jù)為例:
# encoding: utf-8
import MySQLdb
# 打開數(shù)據(jù)庫連接
db = MySQLdb.connect("localhost","root","361way","test" )
# 使用cursor()方法獲取操作游標(biāo)
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]
# 打印結(jié)果
print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fecth data"
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
以上腳本執(zhí)行結(jié)果如下:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
4、數(shù)據(jù)庫更新操作
更新操作用于更新數(shù)據(jù)表的的數(shù)據(jù),以下實(shí)例將 test表中的 SEX 字段全部修改為 'M',AGE 字段遞增1:
#!/usr/bin/python
import MySQLdb
# 打開數(shù)據(jù)庫連接
db = MySQLdb.connect("localhost","root","361way","test" )
# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()
# SQL 更新語句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# 執(zhí)行SQL語句
cursor.execute(sql)
# 提交到數(shù)據(jù)庫執(zhí)行
db.commit()
except:
# 發(fā)生錯(cuò)誤時(shí)回滾
db.rollback()
# 關(guān)閉數(shù)據(jù)庫連接
db.close()
5、執(zhí)行事務(wù)
事務(wù)機(jī)制可以確保數(shù)據(jù)一致性。
事務(wù)應(yīng)該具有4個(gè)屬性:原子性、一致性、隔離性、持久性。這四個(gè)屬性通常稱為ACID特性。
① 原子性(atomicity)。一個(gè)事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中包括的諸操作要么都做,要么都不做。
② 一致性(consistency)。事務(wù)必須是使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。一致性與原子性是密切相關(guān)的。
③ 隔離性(isolation)。一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
④ 持久性(durability)。持續(xù)性也稱永久性(permanence),指一個(gè)事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其有任何影響。
Python DB API 2.0 的事務(wù)提供了兩個(gè)方法 commit 或 rollback。實(shí)例:
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# 執(zhí)行SQL語句
cursor.execute(sql)
# 向數(shù)據(jù)庫提交
db.commit()
except:
# 發(fā)生錯(cuò)誤時(shí)回滾
db.rollback()
對于支持事務(wù)的數(shù)據(jù)庫, 在Python數(shù)據(jù)庫編程中,當(dāng)游標(biāo)建立之時(shí),就自動開始了一個(gè)隱形的數(shù)據(jù)庫事務(wù)。commit()方法游標(biāo)的所有更新操作,rollback()方法回滾當(dāng)前游標(biāo)的所有操作。每一個(gè)方法都開始了一個(gè)新的事務(wù)。
希望本文所述對大家的Python程序設(shè)計(jì)有所幫助。
- 解決pycharm導(dǎo)入本地py文件時(shí),模塊下方出現(xiàn)紅色波浪線的問題
- pycharm中導(dǎo)入模塊錯(cuò)誤時(shí)提示Try to run this command from the system terminal
- Pycharm中出現(xiàn)ImportError:DLL load failed:找不到指定模塊的解決方法
- 解決Pycharm 包已經(jīng)下載,但是運(yùn)行代碼提示找不到模塊的問題
- Pycharm編輯器技巧之自動導(dǎo)入模塊詳解
- python MysqlDb模塊安裝及其使用詳解
- Python下的Mysql模塊MySQLdb安裝詳解
- 關(guān)于pycharm找不到MySQLdb模塊的解決方法
相關(guān)文章
Python+FuzzyWuzzy實(shí)現(xiàn)模糊匹配的示例詳解
在日常開發(fā)工作中,經(jīng)常會遇到這樣的一個(gè)問題:要對數(shù)據(jù)中的某個(gè)字段進(jìn)行匹配,但這個(gè)字段有可能會有微小的差異。本文將分享一個(gè)簡單易用的模糊字符串匹配工具包:FuzzyWuzzy,讓你輕松解決煩惱的匹配問題2022-04-04Python+PyQt5實(shí)現(xiàn)滅霸響指功能
這篇文章主要介紹了Python+PyQt5實(shí)現(xiàn)滅霸響指功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Python實(shí)現(xiàn)的爬取網(wǎng)易動態(tài)評論操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)的爬取網(wǎng)易動態(tài)評論操作,結(jié)合實(shí)例形式分析了Python針對網(wǎng)易評論正則爬取及json格式數(shù)據(jù)轉(zhuǎn)換、提取等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06Python庫AutoTS一行代碼得到最強(qiáng)時(shí)序基線
AutoTS它是一個(gè)用于自動時(shí)間序列分析的 Python 庫。AutoTS 允許我們用一行代碼訓(xùn)練多個(gè)時(shí)間序列模型,以便我們可以選擇最適合的模型,今天介紹一種非常霸道的工具,融合了自動化機(jī)器學(xué)習(xí)技術(shù)開發(fā)的AutoTS2022-03-03Flask項(xiàng)目的部署的實(shí)現(xiàn)步驟
本文主要介紹了Flask項(xiàng)目的部署的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Python 類方法和實(shí)例方法(@classmethod),靜態(tài)方法(@staticmethod)原理與用法分析
這篇文章主要介紹了Python 類方法和實(shí)例方法(@classmethod),靜態(tài)方法(@staticmethod),結(jié)合實(shí)例形式分析了Python 類方法和實(shí)例方法及靜態(tài)方法相關(guān)原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09python實(shí)現(xiàn)坦克大戰(zhàn)游戲 附詳細(xì)注釋
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)坦克大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05