目录
一、原理:
二、安装
三、封装
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)