《Python程序設(shè)計基礎(chǔ)》 課件第7章 數(shù)據(jù)庫_第1頁
《Python程序設(shè)計基礎(chǔ)》 課件第7章 數(shù)據(jù)庫_第2頁
《Python程序設(shè)計基礎(chǔ)》 課件第7章 數(shù)據(jù)庫_第3頁
《Python程序設(shè)計基礎(chǔ)》 課件第7章 數(shù)據(jù)庫_第4頁
《Python程序設(shè)計基礎(chǔ)》 課件第7章 數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第7章數(shù)據(jù)庫數(shù)據(jù)庫連接數(shù)據(jù)庫的增刪改操作數(shù)據(jù)庫連接數(shù)據(jù)庫操作的封裝學習目標掌握掌握掌握掌握數(shù)據(jù)庫的創(chuàng)建、查看、選擇與刪除的操作方法12掌握數(shù)據(jù)庫的添加、查詢、修改與刪除、編程應(yīng)用3掌握數(shù)據(jù)庫操作的封裝目錄數(shù)據(jù)庫查詢7.27.1數(shù)據(jù)庫連接7.3數(shù)據(jù)庫的增、刪、改操作數(shù)據(jù)庫操作的封裝7.4知識架構(gòu)7.1數(shù)據(jù)庫連接1Python數(shù)據(jù)庫接口介紹2PyMySQL的安裝3創(chuàng)建數(shù)據(jù)庫連接4學生實踐練習知識架構(gòu)7.2數(shù)據(jù)庫查詢1SQL語句執(zhí)行2查詢方法介紹3學生實踐練習7.1數(shù)據(jù)庫連接1

Python數(shù)據(jù)庫接口介紹

Python標準數(shù)據(jù)庫接口為PythonDB-API,PythonDB-API為開發(fā)人員提供了數(shù)據(jù)庫應(yīng)用編程接口。

PythonDB-API使用流程如下:引入API模塊→獲取與數(shù)據(jù)庫的連接→執(zhí)行SQL語句和存儲過程→關(guān)閉數(shù)據(jù)庫連接。

在本章中,我們將以MySQL數(shù)據(jù)庫的接口為例進行講解。支持MySQL數(shù)據(jù)庫操作的第三方庫有很多,常見的有MySQLConnector(是MySQL官方的純Python驅(qū)動)、MySQLdb(目前只支持到Python2.7版本)和PyMySQL(其使用方法和MySQLdb幾乎相同,PyMySQL支持Python3.x,而MySQLdb不支持3.x版本)7.1數(shù)據(jù)庫連接2

PyMySQL的安裝

在PyCharm工具中選擇“File”→“Settings”菜單,打開PyCharm設(shè)置界面。

單擊右側(cè)的“+”圖標,進入添加第三方庫的界面,在搜索框中輸入“pymysql”搜索PyMySQL庫7.1數(shù)據(jù)庫連接2

PyMySQL的安裝

在界面的左側(cè)列表中選擇PyMySQL,單擊“InstallPackage”按鈕安裝PyMySQL庫。

PyMySQL庫也可以使用pip命令安裝,使用pip命令安裝需要打開cmd命令行工具(在Windows搜索框中搜索cmd),在命令行工具中輸入“pipinstallpymysql”,系統(tǒng)會自動下載安裝7.1數(shù)據(jù)庫連接3

創(chuàng)建數(shù)據(jù)庫連接

importpymysql

#導(dǎo)入pymysql模塊conn=pymysql.connect(host='<數(shù)據(jù)庫IP地址>',port=<端口號>,user='<用戶名>'passwd='<密碼>',db='<數(shù)據(jù)庫名>',charset='utf8')使用PyMySQL創(chuàng)建數(shù)據(jù)庫連接與JDBC類似,通過PyMySQL模塊中的connect()函數(shù)獲取數(shù)據(jù)庫連接對象7.1數(shù)據(jù)庫連接3創(chuàng)建數(shù)據(jù)庫連接

示例7.1

假設(shè),本地已有MySQL數(shù)據(jù)庫test,用戶名為root,密碼為123456,則使用PyMySQL創(chuàng)建數(shù)據(jù)庫連接importpymysql#導(dǎo)入PyMySQL庫#創(chuàng)建數(shù)據(jù)庫連接,注意密碼參數(shù)passwd不要寫成passwordconn=pymysql.connect(host='',port=3306,user='root',passwd='123456',

db='test',charset='utf8')print(conn)7.1數(shù)據(jù)庫連接3創(chuàng)建數(shù)據(jù)庫連接

!運行成功的結(jié)果如下示例7.1是數(shù)據(jù)庫連接成功的示例,如果連接失敗,會提示以下3種信息:(1)如果傳入的端口不正確,在異常的堆棧信息的最后會提示“Can'tconnecttoMySQLserveron''([Errno10061])”。(2)如果傳入的密碼不正確,異常信息中將提示“Accessdeniedforuser'root'@'localhost'(usingpassword:YES)”。(3)傳入的數(shù)據(jù)庫名不正確,異常信息中將提示“Unknowndatabase'test'”。7.1數(shù)據(jù)庫連接4學生實踐練習

1.需求說明安裝PyMySQL庫,使用PyMySQL獲取數(shù)據(jù)庫連接對象。熟悉數(shù)據(jù)庫端口錯誤、用戶名或密碼錯誤及數(shù)據(jù)庫名錯誤這三種情況下的信息提示。2.實現(xiàn)思路(1)使用PyCharm工具安裝PyMySQL庫或使用pip命令進行安裝。(2)使用PyMySQL模塊中的connect()函數(shù)連接MySQL數(shù)據(jù)庫。在函數(shù)中傳入數(shù)據(jù)庫連接的詳細信息。(3)連接成功后,分別修改數(shù)據(jù)庫端口、用戶名或密碼及數(shù)據(jù)庫名,查詢這三種情況的信息提示知識架構(gòu)7.2數(shù)據(jù)庫查詢1SQL語句執(zhí)行2查詢方法介紹3學生實踐練習7.2數(shù)據(jù)庫查詢1

SQL語句執(zhí)行

(1)創(chuàng)建數(shù)據(jù)庫連接,并返回一個數(shù)據(jù)庫連接對象,代碼如下:importpymysql#導(dǎo)入PyMySQL庫#創(chuàng)建數(shù)據(jù)庫連接,connect()函數(shù)返回數(shù)據(jù)連接對象conn=pymysql.connect(host='',

port=3306,user='root',passwd='123456',db='mydb',charset='utf8')(2)使用數(shù)據(jù)庫連接對象中的cursor()函數(shù)獲取游標對象,代碼如下cursor=conn.cursor()7.2數(shù)據(jù)庫查詢1

SQL語句執(zhí)行

(3)調(diào)用游標對象中的execute()函數(shù)執(zhí)行SQL語句,該函數(shù)返回影響的行數(shù)。如查詢某個表記錄,則返回查詢的記錄數(shù)。如果為添加、刪除和修改操作,則返回改變的記錄數(shù),代碼如下:effectedRows=cursor.execute(<sql語句>)(4)提交數(shù)據(jù)庫連接,如果不提交將無法保存新建或者修改的數(shù)據(jù),代碼如下:mit()(5)關(guān)閉游標,釋放資源,代碼如下:cursor.close()(6)關(guān)閉連接,釋放資源,代碼如下:conn.close()7.2數(shù)據(jù)庫查詢1

SQL語句執(zhí)行

示例7.2在PyMySQL數(shù)據(jù)庫中創(chuàng)建user用戶表。importPyMySQL#創(chuàng)建數(shù)據(jù)庫連接conn=pymysql.connect(host='',

port=3306,user='root',passwd='123456',db='mydb',

charset='utf8')cursor=conn.cursor()#獲取游標對象#定義創(chuàng)建user表的SQL語句,使用三引號'''表示格式化字符串sql='''CREATETABLEuser(

useridint(11)NOTNULLauto_increment,

usernamevarchar(60)NOTNULL,

userpassvarchar(60)defaultNULL,

PRIMARYKEY(userid))'''rows=cursor.execute(sql)#執(zhí)行SQL語句mit()#提交數(shù)據(jù)庫連接,如果是增、刪、改操作,必須提交print("user表創(chuàng)建成功")cursor.close()#關(guān)閉游標對象conn.close()#關(guān)閉數(shù)據(jù)庫連接7.2數(shù)據(jù)庫查詢1

SQL語句執(zhí)行

創(chuàng)建user用戶表的運行結(jié)果如圖7.2

數(shù)據(jù)庫查詢1

SQL語句執(zhí)行

在PyMySQL數(shù)據(jù)庫中的user用戶表中添加3條數(shù)據(jù)cursor.execute("insertintouservalues(1,'zhangsan','zhangsan')")cursor.execute("insertintouservalues(2,'lisi','lisi')")cursor.execute("insertintouservalues(3,'wangwu','wangwu')")7.2數(shù)據(jù)庫查詢1

SQL語句執(zhí)行

注意在提交執(zhí)行操作mit()語句之前添加以上語句,否則添加數(shù)據(jù)不成功。添加成功后的user表數(shù)據(jù)如圖:7.2數(shù)據(jù)庫查詢2

查詢方法介紹

7.2.1小節(jié)中介紹了SQL語句的執(zhí)行步驟,數(shù)據(jù)庫的查詢操作步驟與SQL語句的執(zhí)行步驟基本相同,在使用execute()函數(shù)執(zhí)行查詢的SQL語句后,游標對象中提供了fetchone()函數(shù)、fetchmany(size)函數(shù)及fetchall()函數(shù)這三個函數(shù)用來獲取剩余結(jié)果中的數(shù)據(jù),使用代碼如下:row_1=cursor.fetchone()#獲取剩余結(jié)果的第一行數(shù)據(jù)row_2=cursor.fetchmany(3)#獲取剩余結(jié)果前三行數(shù)據(jù)row_3=cursor.fetchall()#獲取剩余結(jié)果所有數(shù)據(jù)7.2數(shù)據(jù)庫查詢2

查詢方法介紹

示例7.3讀取用戶表user中的記錄。importpymysql#創(chuàng)建數(shù)據(jù)庫連接conn=pymysql.connect(host='',

port=3306,user='root',passwd='123456',db='mydb',

charset='utf8')cursor=conn.cursor()#獲取游標對象#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)#獲取字典類型的數(shù)據(jù)rows=cursor.execute("select*fromuser")#執(zhí)行SQL語句print("查詢到%d條用戶記錄數(shù)"%(rows))results=cursor.fetchall()#獲取所有的記錄forrowIteminresults:#循環(huán)遍歷每一行記錄

print("用戶編號:%d用戶名:%s密碼:%s"%(rowItem[0],rowItem[1],

rowItem[2]))mit()#提交數(shù)據(jù)庫連接,如果是增、刪、改操作,必須提交cursor.close()#關(guān)閉游標對象conn.close()#關(guān)閉數(shù)據(jù)庫連接7.2數(shù)據(jù)庫查詢2查詢方法介紹

讀取用戶表user中的記錄,結(jié)果如圖:7.2數(shù)據(jù)庫查詢3學生實踐練習

1.需求說明(1)創(chuàng)建product表,建表的SQL語句如下:

CREATETABLEproduct(

productidint(11)NOTNULLauto_increment,productnamevarchar(60)NOTNULL,priceintdefault0,PRIMARYKEY(productid))(2)使用SQL語句插入三條測試數(shù)據(jù),代碼如下:insertintoproduct(productname,price)values('mi6',2399);insertintoproduct(productname,price)values('meizupro7',2999);insertintoproduct(productname,price)values('vivox9s',2499);(3)查詢該表的所有記錄。7.2數(shù)據(jù)庫查詢3學生實踐練習

2.實現(xiàn)思路(1)定義一個函數(shù)getConn()獲取數(shù)據(jù)庫的連接對象。(2)定義executeSql()函數(shù)獲取游標對象,通過游標對象的execute()函數(shù)分別執(zhí)行建表、SQL插入及查詢的SQL語句。如果是查詢的SQL語句,則通過cursor.fetchall()語句獲取所有的記錄。知識架構(gòu)7.3數(shù)據(jù)庫的增、刪、改操作1數(shù)據(jù)庫增、刪、改操作2事務(wù)機制3學生實踐練習7.3數(shù)據(jù)庫的增、刪、改操作1

數(shù)據(jù)庫增、刪、改操作

!

數(shù)據(jù)庫的增、刪、改操作步驟與SQL語句執(zhí)行步驟基本一致,不同之處在于execute()函數(shù)中執(zhí)行的SQL語句不一致。

如果一次插入多條記錄需要調(diào)用cursor對象的executemany()函數(shù),代碼如下:effect_row=cursor.executemany("insertintoproduct(productname,price)values(%s,%s)",[('mi6',2399),('meizupro7',2999),('vivox9s',2499)])在PyMySQL庫中提供了對存儲過程的調(diào)用,代碼如下:cursor.callproc('p1',args=(1,22,3,4))#有參的存儲過程調(diào)用cursor.execute("select@p1,@_p1_1,@_p1_2,@_p1_3")#獲取執(zhí)行完存儲的參數(shù),參數(shù)以@開頭7.3數(shù)據(jù)庫的增、刪、改操作1

數(shù)據(jù)庫增、刪、改操作

【注意】有些黑客利用現(xiàn)有應(yīng)用程序,將SQL命令注入到后臺執(zhí)行的SQL語句中,它可以通過在Web表單中輸入SQL語句,得到一個存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫,而不是按照設(shè)計者意圖去執(zhí)行SQL語句,這種現(xiàn)象稱為SQL的注入,如訪問Default.aspx?jobid=1'or'1'='1地址時,傳到后臺通過字符串拼接進行查詢時的SQL語句變成SELECT*FROMjobsWHEREjob_id='1'OR'1'='1',導(dǎo)致查詢出所有的記錄。因此強烈建議使用PyMySQL提供的參數(shù)化語句,代碼如下:row_count=cursor.execute("select*fromuserwhereusername=%sanduserpass=%s",(user,passwd))7.3數(shù)據(jù)庫的增、刪、改操作1

數(shù)據(jù)庫增、刪、改操作

示例7.3定義一個執(zhí)行SQL語句的方法,分別執(zhí)行添加多行記錄、修改和刪除操作importpymysqlimporttypesdefexecuteSQL(sql,params):

#創(chuàng)建數(shù)據(jù)庫連接,注意密碼參數(shù)passwd不要寫成passwordconn=pymysql.connect(host='',

port=3306,user='root',passwd='123456',

db='mydb',charset='utf8')

cursor=conn.cursor()

effectedNum=0#影響的記錄數(shù)

iftype(params)==list:#判斷params是否為list列表類型

effectedNum=cursor.executemany(sql,params)#為list列表類型執(zhí)行多條記錄

else:

effectedNum=cursor.execute(sql,params)

mit()

cursor.close()

conn.close()

returneffectedNum7.3數(shù)據(jù)庫的增、刪、改操作1

數(shù)據(jù)庫增、刪、改操作

示例7.3定義一個執(zhí)行SQL語句的方法,分別執(zhí)行添加多行記錄、修改和刪除操作#添加多行記錄num1=executeSQL("insertintoproduct(productname,price)values(%s,%s)",

[('mi6',2399),('meizupro7',2999),('vivox9s',2499)])num2=executeSQL("insertintoproduct(productname,price)values(%s,%s)",('minote2',

1799))num3=executeSQL("updateproductsetprice=%swhereproductname=%s",(1999,'mi6'))num4=executeSQL("deletefromproductwhereproductname=%s",('meizupro7'))print("四次操作影響的記錄數(shù)分別為%d,%d,%d,%d"%(num1,num2,num3,num4))7.3數(shù)據(jù)庫的增、刪、改操作1

數(shù)據(jù)庫增、刪、改操作

添加多行記錄、修改和刪除操作的運行結(jié)果如圖7.3數(shù)據(jù)庫的增、刪、改操作2

事務(wù)機制

原子性(Atomicity):

一個事務(wù)是一個不可分割的工作單位,對于事務(wù)中包括的諸多操作,要么都做,要么都不做一致性(Consistency):

事務(wù)必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。一致性與原子性是密切相關(guān)的

事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都能成功完成,否則不會永久更新面向數(shù)據(jù)的資源。通過將一組相關(guān)操作組合為一個不是全部成功就是全部失敗的單元,可以簡化錯誤恢復(fù)并使應(yīng)用程序更加可靠。事務(wù)具有4個屬性:原子性、一致性、隔離性和持久性。這4個屬性通常被稱為ACID特性7.3數(shù)據(jù)庫的增、刪、改操作2

事務(wù)機制

隔離性(Isolation):

一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。持久性(Durability):

持續(xù)性也稱永久性(Permanence),指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其有任何影響。7.3數(shù)據(jù)庫的增、刪、改操作2

事務(wù)機制

示例7.5在示例7.4的基礎(chǔ)上,設(shè)表中已有“zhangsan”和“l(fā)isi”兩個賬戶,模擬“zhangsan”賬戶向“l(fā)isi”轉(zhuǎn)賬50。importpymysqldeftransfer():#轉(zhuǎn)賬的方法

#創(chuàng)建數(shù)據(jù)庫連接

conn=pymysql.connect(host='',

port=3306,user='root',passwd='123456',

db='mydb',charset='utf8')

cursor=conn.cursor()

try:

balanceQuerysql="selectbalancefromaccountwhereaccount=%s"

cursor.execute(balanceQuerysql,("zhangsan"))

results=cursor.fetchone()

balance=0

iflen(results)>0:

balance=results[0]7.3數(shù)據(jù)庫的增、刪、改操作2

事務(wù)機制

ifbalance>50:

#zhangsan賬戶余額需要減去50

cursor.execute("updateaccountsetbalance=balance-50"

"whereaccount=%s",("zhangsan"))

#lisi賬戶余額增加50

cursor.execute("updateaccountsetbalance=balance+50"

"whereaccount=%s",("lisi"))

cursor.execute("select*fromaccount")#查詢所有記錄

results=cursor.fetchall()#獲取所有的記錄

print(results)

cmit()#提交事務(wù)

exceptExceptionase:

print(e)

conn.rollback()#回滾事務(wù),之前的修改操作都不生效

finally:#無論是否產(chǎn)生異常都將關(guān)閉游標和數(shù)據(jù)庫連接對象

cursor.close()

conn.close()if__name__=='__main__':#類似于java的main函數(shù),也可以直接調(diào)用transfer()

transfer()7.3數(shù)據(jù)庫的增、刪、改操作2

事務(wù)機制

模擬“zhangsan”賬戶向“l(fā)isi”轉(zhuǎn)賬50,運行結(jié)果如圖7.3數(shù)據(jù)庫的增、刪、改操作2

事務(wù)機制

模擬“zhangsan”賬戶向“l(fā)isi”轉(zhuǎn)賬50,運行結(jié)果如圖7.3數(shù)據(jù)庫的增、刪、改操作2

事務(wù)機制

模擬“zhangsan”賬戶向“l(fā)isi”轉(zhuǎn)賬50,運行結(jié)果如圖7.3數(shù)據(jù)庫的增、刪、改操作3

學生實踐練習

根據(jù)提示操作實現(xiàn)數(shù)據(jù)庫的增、刪、改操作。使用7.2節(jié)實踐練習的product表進操作,效果如圖1.需求說明2.實現(xiàn)思路(1)定義一個函數(shù)connDb(),用來獲取數(shù)據(jù)庫連接及游標對象。(2)定義一個函數(shù)executeSQL(),執(zhí)行增、刪、改操作。(3)定義一個函數(shù)query(),執(zhí)行查詢操作。(4)在循環(huán)中提示選擇操作類型,根據(jù)操作類型執(zhí)行對應(yīng)的操作知識架構(gòu)7.4數(shù)據(jù)庫操作的封裝1封裝介紹2對數(shù)據(jù)庫操作進行封裝3學生實踐練習7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

對數(shù)據(jù)庫操作進行封裝可以重復(fù)使用封裝的對象或方法,不需要每次都編寫打開數(shù)據(jù)庫連接、獲取游標對象及關(guān)閉數(shù)據(jù)庫連接等步驟的代碼,從而可以大大減少代碼量,提高代碼的可維護性。

在數(shù)據(jù)庫的封裝過程中,我們將使用with簡化連接過程。在讀取文件時,文件對象中包含__enter__()函數(shù)和__exit__()函數(shù),因此可以使用with語句。__enter__()函數(shù)在with觸發(fā)時執(zhí)行,__exit__()是退出時執(zhí)行。使用with讀取文件代碼如下:withopen('filename','r')asf:

printf.readline()7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

示例7.6針對一些需要關(guān)邏輯的代碼,構(gòu)造成with的模式classecho:

def__enter__(self):

print('with語句被觸發(fā)了')

def__exit__(self,*args):

print('with語句執(zhí)行完退出')withecho()ase:

print('with要執(zhí)行的內(nèi)容')示例7.6針對一些需要關(guān)邏輯的代碼,構(gòu)造成with的模式7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

構(gòu)造with模式的運行結(jié)果如圖7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

示例7.7使用yield分別輸出1~3的平方defcreateGenerator():

foriinrange(3):#循環(huán)遍歷0~2三個數(shù)字

yieldi*igenerator=createGenerator()#方法返回一個生成器forjingenerator:

print(j)7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

使用yield分別輸出1~3的平方,運行結(jié)果如圖7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

contextlib是個比with簡潔且提供上下文機制的模塊,它是通過Generator裝飾器實現(xiàn)的,不再是采用__enter__()和__exit__()的機制。contextlib中的contextmanager作為裝飾器來提供一種針對函數(shù)級別的上下文管理機制7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

示例7.8使用with關(guān)鍵字和yield關(guān)鍵字封裝contextlib提供的上下文機制fromcontextlibimportcontextmanager@contextmanagerdefmake_context():

print('方法開始')

try:

yield"生成器的內(nèi)容"

exceptRuntimeErroraserr:

print('出現(xiàn)異常',err)

finally:

print('方法退出')withmake_context()asvalue:

print(value)7.4數(shù)據(jù)庫操作的封裝1

封裝介紹

操作contextlib提供的上下文機制,運行結(jié)果如圖7.4數(shù)據(jù)庫操作的封裝2

對數(shù)據(jù)庫操作進行封裝

在數(shù)據(jù)庫操作過程中,每次都需要對數(shù)據(jù)庫進行連接和關(guān)閉,比較麻煩,每進行一次數(shù)據(jù)庫連接都會耗費系統(tǒng)的資源和時間。通過對數(shù)據(jù)庫操作的封裝盡量減少該問題的發(fā)生,有助于提高代碼的可重復(fù)利用性,減少代碼量,讓數(shù)據(jù)庫操作使用變得更加簡單。

數(shù)據(jù)庫的操作封裝可以使用上一階段介紹的contextlib模塊提供的上下文機制解決。

使用contextlib模塊對數(shù)據(jù)庫的操作進行封裝,為了在一次連接和關(guān)閉的操作中能執(zhí)行多次數(shù)據(jù)庫的增、刪、改、查操作,對數(shù)據(jù)庫的封裝需要使用with語句獲取游標對象。每執(zhí)行一次with語句都將開啟一個新的數(shù)據(jù)庫連接。與之前的方式相比,在with語句中執(zhí)行多次數(shù)據(jù)庫操作都只需要創(chuàng)建一次數(shù)據(jù)庫連接和關(guān)閉連接。7.4數(shù)據(jù)庫操作的封裝2

對數(shù)據(jù)庫操作進行封裝

示例7.9將數(shù)據(jù)庫操作封裝成DBHelper.py文件importpymysqlimportcontextlibclassDBHelper():

def__init__(self):

pass

#定義上下文管理器,連接后自動關(guān)閉連接

@contextlib.contextmanager

defcursor(self,host='',port=3306,user='root',

passwd='123456',db='mydb',charset='utf8'):

#創(chuàng)建數(shù)據(jù)庫連接

conn=pymysql.connect(host=host,port=port,user=user,

passwd=passwd,db=db,charset=charset)

#以字典的形式獲取數(shù)據(jù)

cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)

print("-------------------")

7.4數(shù)據(jù)庫操作的封裝2

對數(shù)據(jù)庫操作進行封裝

try:

yieldcursor

mit()#操作成功后提交事務(wù)

exceptExceptionase:

print(e)

conn.rollback()#出現(xiàn)異常進行回滾操作

finally:

cursor.close()

conn.close()

defqueryAll(self,cursor,sql,params=None):#查詢所有的記錄

cursor.execute(sql,params)

returncursor.fetchall()

#執(zhí)行SQL語句,返回影響的記錄數(shù)

defexecute(self,cursor,sql,params=None):

effectedNum=cursor.execute(sql,params)

returneffectedNumif__name__=="__main__":

#封裝使用

dbHelper=DBHelper()

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論