当前位置:   article > 正文

Flask数据库连接池 DBUtils 模块_flask dbutils

flask dbutils

目录

一、原理:

二、安装

三、封装


一、原理:

flask中是没有ORM的,如果在flask里面连接数据库有两种方式

1:pymysql
2:SQLAlchemy:是python 操作数据库的一个库。能够进行 orm 映射官方文档 sqlchemy


SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。

这里我们重点节点介绍【BDUtils数据库链接池】
 链接池原理:
- 模式一:基于threaing.local实现为每一个线程创建一个连接,关闭是伪关闭,当前线程可以重复。
- 模式二:连接池原理
- 可以设置连接池中最大连接数 9
- 默认启动时,连接池中创建连接 5
- 如果有三个线程来数据库中获取连接:
  - a 如果三个同时来的,一人给一个链接
  - b 如果一个一个来,有时间间隔,用一个链接就可以为三个线程提供服务
  - c 说不准
    有可能:1个链接就可以为三个线程提供服务
    有可能:2个链接就可以为三个线程提供服务
    有可能:3个链接就可以为三个线程提供服务
PS、:maxshared在使用pymysql中均无用。链接数据库的模块:只有threadsafety>1的时候才有用。

 

那么我们用pymysql来做。为什么要使用数据库连接池呢?不用连接池有什么不好的地方呢?

那是因为使用pymysql,每次操作都要链接数据库,链接次数过多。

二、安装

pip install DBUtils

三、封装

  1. # 新建一个db的py文件
  2. import pymysql
  3. from DBUtils.PooledDB import PooledDB, SharedDBConnection
  4. POOL = PooledDB(
  5. creator=pymysql, # 使用链接数据库的模块
  6. maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
  7. mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
  8. maxcached=5, # 链接池中最多闲置的链接,0和None不限制
  9. maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,
  10. # 因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论
  11. # 设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
  12. blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
  13. maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
  14. setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
  15. ping=0,
  16. # ping MySQL服务端,检查是否服务可用。
  17. # 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created,
  18. # 4 = when a query is executed, 7 = always
  19. host='127.0.0.1',
  20. port=3306,
  21. user='root', #用户名
  22. password='mima', #密码
  23. database='db', #库名
  24. charset='utf8',
  25. # cursorclass = pymysql.cursors.DictCursor # 配置数据已字典的类型返回,不配置返回元组
  26. # 在默认情况下cursor方法返回的是BaseCursor类型对象,BaseCursor类型对象在执行查询后每条记录的结果以列表(list)表示。
  27. # 如果要返回字典(dict)表示的记录,就要设置cursorclass参数为pymysql.cursors.DictCursor类。
  28. )
  29. class ConnectDB(object):
  30. def __init__(self):
  31. self.conn = POOL.connection()
  32. try:
  33. # self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
  34. self.cursor = self.conn.cursor()
  35. print("连接数据库成功!")
  36. except Exception as e:
  37. print("连接数据库失败:%s " % e)
  38. def get_one(self, sql_script):
  39. try:
  40. cursor = self.cursor # 获取游标
  41. cursor.execute(sql_script)
  42. data = cursor.fetchone()
  43. print("sql执行成功!信息:%s" % sql_script)
  44. print("获取查询结果!信息:%s" % str(data[0]))
  45. return data[0]
  46. except Exception as e:
  47. print("执行sql出现错误,信息: %s " % e)
  48. finally:
  49. self.cursor.close()
  50. self.conn.close()
  51. # 获取多条查询结果
  52. def get_all(self, sql_script):
  53. try:
  54. cursor = self.cursor # 获取游标
  55. cursor.execute(sql_script)
  56. data = cursor.fetchall()
  57. print("sql执行成功!信息:%s" % sql_script)
  58. print("获取查询结果!信息:%s" % str(data))
  59. return data
  60. except Exception as e:
  61. print("执行sql出现错误,信息: %s " % e)
  62. finally:
  63. self.cursor.close()
  64. self.conn.close()
  65. if __name__ == '__main__':
  66. sql = 'SELECT * FROM tb1 WHERE id=%s'
  67. sql1 = (1,)
  68. result = ConnectDB().get_all(sql, sql1)
  69. print(result)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/496600
推荐阅读
相关标签
  

闽ICP备14008679号