python数据库优化_Python学习(二十九)—— pymysql操作数据库优化
转载自:http://www.cnblogs.com/liwenzhou/articles/8283687.html
我们之前使用pymysql操作数据库的操作都是写死在视图函数中的,并且很多都是重复的代码。
我们可以优化一下,把重复的代码提取出来,写成函数:
importpymysql#定义一个数据库相关的配置项
DB_CONFIG ={"host": "127.0.0.1","port": 3306,"user": "root","passwd": "root1234","db": "mysite","charset": "utf8"}#查询多条数据函数
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#查询单条数据函数
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()#创建记录
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()#返回刚才创建的那条数据的ID
last_id =cursor.lastrowid
cursor.close()
conn.close()return last_id
这样只要在需要连接数据库做操作的时候,只需要调用我们上面定义好的函数就可以了。
但是这样还是有问题,当我要大批量创建数据的时候,就需要多次调用create方法了,相当于多次连接多次提交。
可以继续优化下,把数据库的连接重用,做到只需一次连接就可执行多次操作。
classSQLManager(object):#初始化实例方法
def __init__(self):
self.conn=None
self.cursor=None
self.connect()#连接数据库
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)#查询多条数据
def get_list(self, sql, args=None):
self.cursor.execute(sql, args)
result=self.cursor.fetchall()returnresult#查询单条数据
def get_one(self, sql, args=None):
self.cursor.execute(sql, args)
result=self.cursor.fetchone()returnresult#执行单条SQL语句
def moddify(self, sql, args=None):
self.cursor.execute(sql, args)
self.conn.commit()#创建单条记录的语句
def create(self, sql, args=None):
self.cursor.execute(sql, args)
self.conn.commit()
last_id=self.cursor.lastrowidreturnlast_id#关闭数据库cursor和连接
defclose(self):
self.cursor.close()
self.conn.close()
我们把我们数据库的相关操作都封装成一个类,在用到的时候,只需要生成一个实例,并对实例调用相应的操作方法就可以了。
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()
但是,我如果要批量执行多个创建操作,虽然只建立了一次数据库连接但是还是会多次提交,可不可以改成一次连接,一次提交呢?
可以,只需要用上pymysql的executemany()方法就可以了。
给我们的 SQLManager类添加一个批量执行的 multi_modify()方法就可以了。
#执行多条SQL语句
def multi_modify(self, sql, args=None):
self.cursor.executemany(sql, args)
self.conn.commit()
现在我们如果一次执行多个创建操作的话就可以使用multi_modify()方法,实现一次连接一次提交了。
最后,我们每次操作完数据库之后都要手动关闭,可不可以写成自动关闭的呢?
联想到我们之前学过的文件操作,使用with语句可以实现缩进结束自动关闭文件句柄的例子。
我们来把我们的数据库连接类SQLManager类再优化下,使其支持with语句操作。
classSQLManager(object):#初始化实例方法
def __init__(self):
self.conn=None
self.cursor=None
self.connect()#连接数据库
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)#查询多条数据
def get_list(self, sql, args=None):
self.cursor.execute(sql, args)
result=self.cursor.fetchall()returnresult#查询单条数据
def get_one(self, sql, args=None):
self.cursor.execute(sql, args)
result=self.cursor.fetchone()returnresult#执行单条SQL语句
def moddify(self, sql, args=None):
self.cursor.execute(sql, args)
self.conn.commit()#执行多条SQL语句
def multi_modify(self, sql, args=None):
self.cursor.executemany(sql, args)
self.conn.commit()#创建单条记录的语句
def create(self, sql, args=None):
self.cursor.execute(sql, args)
self.conn.commit()
last_id=self.cursor.lastrowidreturnlast_id#关闭数据库cursor和连接
defclose(self):
self.cursor.close()
self.conn.close()#进入with语句自动执行
def __enter__(self):returnself#退出with语句块自动执行
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
现阶段,我们只需要优化到这一步就可以,后面的项目实战中会继续优化。如使用数据库连接池等。
python数据库优化_Python学习(二十九)—— pymysql操作数据库优化相关推荐
- python爬虫影评_Python爬虫(二十)_动态爬取影评信息
本案例介绍从JavaScript中采集加载的数据.更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import t ...
- 小甲鱼python笔记_小甲鱼《零基础学习Python》课后笔记(二十九):文件——一个任务...
动动手 0.编写一个程序,接受用户的输入并保存为新的文件,程序实现如图: 代码如下:f_name = input('请输入文件名:') f = open(f_name, 'wt') print(&qu ...
- ballerina 学习二十九 数据库操作
ballerina 数据操作也是比较方便的,官方也我们提供了数据操作的抽象,但是我们还是依赖数据库驱动的. 数据库驱动还是jdbc模式的 项目准备 项目结构 ├── mysql_demo │ ├── ...
- python学习 (二十九) range函数
1:list函数可以将其他类型转成list. print(list(range(0, 10))) 2: list函数把元组转成list t = (1, 3, 3, 5) print(list(t)) ...
- Java多线程学习二十九:AtomicInteger(原子类) 和 synchronized 的异同点?
原子类和 synchronized 关键字都可以用来保证线程安全,在本课时中,我们首先分别用原子类和 synchronized 关键字来解决一个经典的线程安全问题,给出具体的代码对比,然后再分析它们背 ...
- MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子
前言 代码明细可参见 MATLAB实战系列(八)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)(附MATLAB代码) 交叉算子的实现机制 我们还是以求解TSP问题为例,8个城市的坐标如下所示. ...
- Golang学习(二十九)序列化和反序列化
我们不同编程语言之间的数据是无法直接交互的,我们想要解决这个问题 就需要将不同语言之间传输的数据做一个统一规范,而json是目前最流行的数据格式 一.json是什么 json 是一种数据交换格式,主要 ...
- 技术 | Python从零开始系列连载(二十九)
写爬虫防止被封的关键有以下几点: ● 伪装请求报头(request header) ● 减轻访问频率,速度 ● 使用代理IP 一般第一点都能做到,第二点减轻访问频率就会大大增加任务时间,而使 ...
- OpenGL学习二十九:模板缓冲区与模板测试
帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据. 深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度 ...
- Python遥感图像处理应用篇(二十九):遥感图像拉伸处理
1.实验目的 将原始遥感图像各个波段拉伸到0-255范围显示. 运行环境:windows10 pycharm python3.7.7 GDAL-3.2.3-cp37-cp37m-win_amd64.w ...
最新文章
- 架构师之路 — API 经济 — 权限管理系统(分权分域设计)
- weblogic java虚拟机_weblogic server 性能及调优-调优 java 虚拟机.doc
- 高级图像去雾算法的快速实现
- SAP CRM Business Partner API的buffer工作原理
- 【Gamma】PhyLab 测试报告
- python表示数字6_Python3 数字Number(六)
- JZOJ_3928. 射击 (Standard IO)
- paip.python 调用qt ui 总结
- MT【276】正切的半角公式
- opensource项目_2020 Opensource.com夏季阅读列表
- bom实现方块移动_HTML 方块移动
- 航姿参考系统(AHRS)
- html 屏幕旋转,屏幕旋转与Transform
- web前端期末大作业 HTML+CSS+JavaScript仿唯品会购物商城网页设计实例 企业网站制作
- 【雷达仿真 | FMCW TDMA-MIMO毫米波雷达信号处理仿真(可修改为DDMA-MIMO)】
- 给热心老哥搭个窝,2021年30分钟用Discourse搭建新一代BBS论坛站全攻略
- 基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的教室图书馆座位预约小程序系统设计与实现
- 数字化技术在制造业的应用要点—产品开发篇
- Audio Unit(三):Audio Unit Development Fundamentals
- android:layout_gravity=end,android layout_gravity 和gravity
热门文章
- suface怎么把计算机放到桌面,快速使用Surface的八条技巧
- 电气论文:基于遗传算法加非线性规划的水火电力系统经济调度(有程序和数据)
- VTK:参数Kuen用法实战
- VTK:vtkCursor2D用法实战
- boost::assertion_failed_msg相关的测试程序
- boost::regex模块实现config_info 来打印正则表达式库配置信息的测试程序
- boost::mpi模块is_mpi_op 功能的测试
- boost::static_min_max_signed_type用法的测试程序
- 基于享元记忆的 Boost.Flyweight 示例
- boost::coroutine模块实现不对称链的测试程序