日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

python数据库优化_Python学习(二十九)—— pymysql操作数据库优化

發(fā)布時間:2024/9/27 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python数据库优化_Python学习(二十九)—— pymysql操作数据库优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自:http://www.cnblogs.com/liwenzhou/articles/8283687.html

我們之前使用pymysql操作數(shù)據(jù)庫的操作都是寫死在視圖函數(shù)中的,并且很多都是重復的代碼。

我們可以優(yōu)化一下,把重復的代碼提取出來,寫成函數(shù):

importpymysql#定義一個數(shù)據(jù)庫相關的配置項

DB_CONFIG ={"host": "127.0.0.1","port": 3306,"user": "root","passwd": "root1234","db": "mysite","charset": "utf8"}#查詢多條數(shù)據(jù)函數(shù)

def get_list(sql, args=None):

conn=pymysql.connect(

host=DB_CONFIG["host"],

port=DB_CONFIG["port"],

user=DB_CONFIG["user"],

passwd=DB_CONFIG["passwd"],

db=DB_CONFIG["db"],

charset=DB_CONFIG["charset"]

)

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

cursor.execute(sql, args)

result=cursor.fetchall()

cursor.close()

conn.close()returnresult#查詢單條數(shù)據(jù)函數(shù)

def get_one(sql, args=None):

conn=pymysql.connect(

host=DB_CONFIG["host"],

port=DB_CONFIG["port"],

user=DB_CONFIG["user"],

passwd=DB_CONFIG["passwd"],

db=DB_CONFIG["db"],

charset=DB_CONFIG["charset"]

)

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

cursor.execute(sql, args)

result=cursor.fetchone()

cursor.close()

conn.close()returnresult#修改記錄

def modify(sql, args=None):

conn=pymysql.connect(

host=DB_CONFIG["host"],

port=DB_CONFIG["port"],

user=DB_CONFIG["user"],

passwd=DB_CONFIG["passwd"],

db=DB_CONFIG["db"],

charset=DB_CONFIG["charset"]

)

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

cursor.execute(sql, args)

conn.commit()

cursor.close()

conn.close()#創(chuàng)建記錄

def create(sql, args=None):

conn=pymysql.connect(

host=DB_CONFIG["host"],

port=DB_CONFIG["port"],

user=DB_CONFIG["user"],

passwd=DB_CONFIG["passwd"],

db=DB_CONFIG["db"],

charset=DB_CONFIG["charset"]

)

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

cursor.execute(sql, args)

conn.commit()#返回剛才創(chuàng)建的那條數(shù)據(jù)的ID

last_id =cursor.lastrowid

cursor.close()

conn.close()return last_id

這樣只要在需要連接數(shù)據(jù)庫做操作的時候,只需要調(diào)用我們上面定義好的函數(shù)就可以了。

但是這樣還是有問題,當我要大批量創(chuàng)建數(shù)據(jù)的時候,就需要多次調(diào)用create方法了,相當于多次連接多次提交。

可以繼續(xù)優(yōu)化下,把數(shù)據(jù)庫的連接重用,做到只需一次連接就可執(zhí)行多次操作。

classSQLManager(object):#初始化實例方法

def __init__(self):

self.conn=None

self.cursor=None

self.connect()#連接數(shù)據(jù)庫

defconnect(self):

self.conn=pymysql.connect(

host=DB_CONFIG["host"],

port=DB_CONFIG["port"],

user=DB_CONFIG["user"],

passwd=DB_CONFIG["passwd"],

db=DB_CONFIG["db"],

charset=DB_CONFIG["charset"]

)

self.cursor= self.conn.cursor(cursor=pymysql.cursors.DictCursor)#查詢多條數(shù)據(jù)

def get_list(self, sql, args=None):

self.cursor.execute(sql, args)

result=self.cursor.fetchall()returnresult#查詢單條數(shù)據(jù)

def get_one(self, sql, args=None):

self.cursor.execute(sql, args)

result=self.cursor.fetchone()returnresult#執(zhí)行單條SQL語句

def moddify(self, sql, args=None):

self.cursor.execute(sql, args)

self.conn.commit()#創(chuàng)建單條記錄的語句

def create(self, sql, args=None):

self.cursor.execute(sql, args)

self.conn.commit()

last_id=self.cursor.lastrowidreturnlast_id#關閉數(shù)據(jù)庫cursor和連接

defclose(self):

self.cursor.close()

self.conn.close()

我們把我們數(shù)據(jù)庫的相關操作都封裝成一個類,在用到的時候,只需要生成一個實例,并對實例調(diào)用相應的操作方法就可以了。

db =SQLManager()

class_list= db.get_list("select id, name from class")

teacher_info= db.get_list("SELECT teacher.id, teacher.name, teacher2class.class_id FROM teacher LEFT JOIN teacher2class ON teacher.id = teacher2class.teacher_id WHERE teacher.id=%s;", [teacher_id])

db.close()

但是,我如果要批量執(zhí)行多個創(chuàng)建操作,雖然只建立了一次數(shù)據(jù)庫連接但是還是會多次提交,可不可以改成一次連接,一次提交呢?

可以,只需要用上pymysql的executemany()方法就可以了。

給我們的 SQLManager類添加一個批量執(zhí)行的?multi_modify()方法就可以了。

#執(zhí)行多條SQL語句

def multi_modify(self, sql, args=None):

self.cursor.executemany(sql, args)

self.conn.commit()

現(xiàn)在我們?nèi)绻淮螆?zhí)行多個創(chuàng)建操作的話就可以使用multi_modify()方法,實現(xiàn)一次連接一次提交了。

最后,我們每次操作完數(shù)據(jù)庫之后都要手動關閉,可不可以寫成自動關閉的呢?

聯(lián)想到我們之前學過的文件操作,使用with語句可以實現(xiàn)縮進結束自動關閉文件句柄的例子。

我們來把我們的數(shù)據(jù)庫連接類SQLManager類再優(yōu)化下,使其支持with語句操作。

classSQLManager(object):#初始化實例方法

def __init__(self):

self.conn=None

self.cursor=None

self.connect()#連接數(shù)據(jù)庫

defconnect(self):

self.conn=pymysql.connect(

host=DB_CONFIG["host"],

port=DB_CONFIG["port"],

user=DB_CONFIG["user"],

passwd=DB_CONFIG["passwd"],

db=DB_CONFIG["db"],

charset=DB_CONFIG["charset"]

)

self.cursor= self.conn.cursor(cursor=pymysql.cursors.DictCursor)#查詢多條數(shù)據(jù)

def get_list(self, sql, args=None):

self.cursor.execute(sql, args)

result=self.cursor.fetchall()returnresult#查詢單條數(shù)據(jù)

def get_one(self, sql, args=None):

self.cursor.execute(sql, args)

result=self.cursor.fetchone()returnresult#執(zhí)行單條SQL語句

def moddify(self, sql, args=None):

self.cursor.execute(sql, args)

self.conn.commit()#執(zhí)行多條SQL語句

def multi_modify(self, sql, args=None):

self.cursor.executemany(sql, args)

self.conn.commit()#創(chuàng)建單條記錄的語句

def create(self, sql, args=None):

self.cursor.execute(sql, args)

self.conn.commit()

last_id=self.cursor.lastrowidreturnlast_id#關閉數(shù)據(jù)庫cursor和連接

defclose(self):

self.cursor.close()

self.conn.close()#進入with語句自動執(zhí)行

def __enter__(self):returnself#退出with語句塊自動執(zhí)行

def __exit__(self, exc_type, exc_val, exc_tb):

self.close()

現(xiàn)階段,我們只需要優(yōu)化到這一步就可以,后面的項目實戰(zhàn)中會繼續(xù)優(yōu)化。如使用數(shù)據(jù)庫連接池等。

總結

以上是生活随笔為你收集整理的python数据库优化_Python学习(二十九)—— pymysql操作数据库优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。