赞
踩
目录
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
- # 新建一个db的py文件
- import pymysql
- from DBUtils.PooledDB import PooledDB, SharedDBConnection
- POOL = PooledDB(
- creator=pymysql, # 使用链接数据库的模块
- maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
- mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
- maxcached=5, # 链接池中最多闲置的链接,0和None不限制
- maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,
- # 因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论
- # 设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
- blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
- maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
- setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
- ping=0,
- # ping MySQL服务端,检查是否服务可用。
- # 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created,
- # 4 = when a query is executed, 7 = always
- host='127.0.0.1',
- port=3306,
- user='root', #用户名
- password='mima', #密码
- database='db', #库名
- charset='utf8',
- # cursorclass = pymysql.cursors.DictCursor # 配置数据已字典的类型返回,不配置返回元组
- # 在默认情况下cursor方法返回的是BaseCursor类型对象,BaseCursor类型对象在执行查询后每条记录的结果以列表(list)表示。
- # 如果要返回字典(dict)表示的记录,就要设置cursorclass参数为pymysql.cursors.DictCursor类。
- )
-
-
- class ConnectDB(object):
- def __init__(self):
- self.conn = POOL.connection()
- try:
- # self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
- self.cursor = self.conn.cursor()
- print("连接数据库成功!")
-
- except Exception as e:
- print("连接数据库失败:%s " % e)
-
- def get_one(self, sql_script):
-
- try:
- cursor = self.cursor # 获取游标
- cursor.execute(sql_script)
- data = cursor.fetchone()
- print("sql执行成功!信息:%s" % sql_script)
- print("获取查询结果!信息:%s" % str(data[0]))
- return data[0]
- except Exception as e:
- print("执行sql出现错误,信息: %s " % e)
- finally:
- self.cursor.close()
- self.conn.close()
-
- # 获取多条查询结果
- def get_all(self, sql_script):
- try:
- cursor = self.cursor # 获取游标
- cursor.execute(sql_script)
- data = cursor.fetchall()
- print("sql执行成功!信息:%s" % sql_script)
- print("获取查询结果!信息:%s" % str(data))
- return data
- except Exception as e:
- print("执行sql出现错误,信息: %s " % e)
- finally:
- self.cursor.close()
- self.conn.close()
-
-
- if __name__ == '__main__':
- sql = 'SELECT * FROM tb1 WHERE id=%s'
- sql1 = (1,)
- result = ConnectDB().get_all(sql, sql1)
- print(result)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。