转载自: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操作数据库优化相关推荐

  1. python爬虫影评_Python爬虫(二十)_动态爬取影评信息

    本案例介绍从JavaScript中采集加载的数据.更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import t ...

  2. 小甲鱼python笔记_小甲鱼《零基础学习Python》课后笔记(二十九):文件——一个任务...

    动动手 0.编写一个程序,接受用户的输入并保存为新的文件,程序实现如图: 代码如下:f_name = input('请输入文件名:') f = open(f_name, 'wt') print(&qu ...

  3. ballerina 学习二十九 数据库操作

    ballerina 数据操作也是比较方便的,官方也我们提供了数据操作的抽象,但是我们还是依赖数据库驱动的. 数据库驱动还是jdbc模式的 项目准备 项目结构 ├── mysql_demo │ ├── ...

  4. python学习 (二十九) range函数

    1:list函数可以将其他类型转成list. print(list(range(0, 10))) 2: list函数把元组转成list t = (1, 3, 3, 5) print(list(t)) ...

  5. Java多线程学习二十九:AtomicInteger(原子类) 和 synchronized 的异同点?

    原子类和 synchronized 关键字都可以用来保证线程安全,在本课时中,我们首先分别用原子类和 synchronized 关键字来解决一个经典的线程安全问题,给出具体的代码对比,然后再分析它们背 ...

  6. MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子

    前言 代码明细可参见 MATLAB实战系列(八)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)(附MATLAB代码) 交叉算子的实现机制 我们还是以求解TSP问题为例,8个城市的坐标如下所示. ...

  7. Golang学习(二十九)序列化和反序列化

    我们不同编程语言之间的数据是无法直接交互的,我们想要解决这个问题 就需要将不同语言之间传输的数据做一个统一规范,而json是目前最流行的数据格式 一.json是什么 json 是一种数据交换格式,主要 ...

  8. 技术 | Python从零开始系列连载(二十九)

    写爬虫防止被封的关键有以下几点: ●  伪装请求报头(request header)  ●  减轻访问频率,速度  ●  使用代理IP 一般第一点都能做到,第二点减轻访问频率就会大大增加任务时间,而使 ...

  9. OpenGL学习二十九:模板缓冲区与模板测试

    帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据. 深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度 ...

  10. Python遥感图像处理应用篇(二十九):遥感图像拉伸处理

    1.实验目的 将原始遥感图像各个波段拉伸到0-255范围显示. 运行环境:windows10 pycharm python3.7.7 GDAL-3.2.3-cp37-cp37m-win_amd64.w ...

最新文章

  1. 架构师之路 — API 经济 — 权限管理系统(分权分域设计)
  2. weblogic java虚拟机_weblogic server 性能及调优-调优 java 虚拟机.doc
  3. 高级图像去雾算法的快速实现
  4. SAP CRM Business Partner API的buffer工作原理
  5. 【Gamma】PhyLab 测试报告
  6. python表示数字6_Python3 数字Number(六)
  7. JZOJ_3928. 射击 (Standard IO)
  8. paip.python 调用qt ui 总结
  9. MT【276】正切的半角公式
  10. opensource项目_2020 Opensource.com夏季阅读列表
  11. bom实现方块移动_HTML 方块移动
  12. 航姿参考系统(AHRS)
  13. html 屏幕旋转,屏幕旋转与Transform
  14. web前端期末大作业 HTML+CSS+JavaScript仿唯品会购物商城网页设计实例 企业网站制作
  15. 【雷达仿真 | FMCW TDMA-MIMO毫米波雷达信号处理仿真(可修改为DDMA-MIMO)】
  16. 给热心老哥搭个窝,2021年30分钟用Discourse搭建新一代BBS论坛站全攻略
  17. 基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的教室图书馆座位预约小程序系统设计与实现
  18. 数字化技术在制造业的应用要点—产品开发篇
  19. Audio Unit(三):Audio Unit Development Fundamentals
  20. android:layout_gravity=end,android layout_gravity 和gravity

热门文章

  1. suface怎么把计算机放到桌面,快速使用Surface的八条技巧
  2. 电气论文:基于遗传算法加非线性规划的水火电力系统经济调度(有程序和数据)
  3. VTK:参数Kuen用法实战
  4. VTK:vtkCursor2D用法实战
  5. boost::assertion_failed_msg相关的测试程序
  6. boost::regex模块实现config_info 来打印正则表达式库配置信息的测试程序
  7. boost::mpi模块is_mpi_op 功能的测试
  8. boost::static_min_max_signed_type用法的测试程序
  9. 基于享元记忆的 Boost.Flyweight 示例
  10. boost::coroutine模块实现不对称链的测试程序