接口数据库连接问题修复

This commit is contained in:
ktianc 2023-09-13 15:02:19 +08:00
parent 53042ed7e3
commit 453517ad0e
2 changed files with 46 additions and 33 deletions

View File

@ -11,7 +11,7 @@ from fastapi.security import OAuth2PasswordBearer
"""
系统版本
"""
VERSION = "2.2.0"
VERSION = "2.3.0"
"""安全警告: 不要在生产中打开调试运行!"""
DEBUG = False

View File

@ -19,38 +19,49 @@ from fastapi import Request
from core.exception import CustomException
from motor.motor_asyncio import AsyncIOMotorDatabase
# 官方文档https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html#sqlalchemy.ext.asyncio.create_async_engine
def create_async_engine_session(database_url: str) -> async_sessionmaker[AsyncSession]:
"""
创建数据库会话
# database_url dialect+driver://username:password@host:port/database
相关配置文档https://docs.sqlalchemy.org/en/14/core/engines.html#database-urls
# echo如果为True引擎将记录所有语句以及它们的参数列表的repr()到默认的日志处理程序该处理程序默认为sys.stdout。如果设置为字符串"debug"
# 结果行也将打印到标准输出。Engine的echo属性可以随时修改以打开和关闭日志记录也可以使用标准的Python logging模块来直接控制日志记录。
database_url dialect+driver://username:password@host:port/database
max_overflow 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=20, # 池中没有连接最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
# echo_pool=False如果为True连接池将记录信息性输出如何时使连接失效以及何时将连接回收到默认的日志处理程序该处理程序默认为sys.stdout。
# 如果设置为字符串"debug"记录将包括池的检出和检入。也可以使用标准的Python logging模块来直接控制日志记录。
:param database_url: 数据库地址
:return:
"""
async_engine = create_async_engine(
database_url,
# pool_pre_ping布尔值如果为True将启用连接池的"pre-ping"功能,该功能在每次检出时测试连接的活动性。
# pool_recycle=-1此设置导致池在给定的秒数后重新使用连接。默认为-1即没有超时。例如将其设置为3600意味着在一小时后重新使用连接。
# 请注意特别是MySQL会在检测到连接8小时内没有活动时自动断开连接尽管可以通过MySQLDB连接自身和服务器配置进行配置
# pool_size=5在连接池内保持打开的连接数。与QueuePool以及SingletonThreadPool一起使用。
# 对于QueuePoolpool_size设置为0表示没有限制要禁用连接池请将poolclass设置为NullPool。
# pool_timeout=30在从池中获取连接之前等待的秒数。仅在QueuePool中使用。这可以是一个浮点数但受Python时间函数的限制可能在几十毫秒内不可靠
# max_overflow 参数用于配置连接池中允许的连接 "溢出" 数量。这个参数用于在高负载情况下处理连接请求的峰值。
# 当连接池的所有连接都在使用中时,如果有新的连接请求到达,连接池可以创建额外的连接来满足这些请求,最多创建的数量由 max_overflow 参数决定。
# 创建数据库连接
async_engine = create_async_engine(
SQLALCHEMY_DATABASE_URL,
echo=False,
echo_pool=False,
pool_pre_ping=True,
pool_recycle=3600,
future=True,
pool_size=5,
max_overflow=5,
connect_args={}
)
return async_sessionmaker(
)
# 创建数据库会话
session_factory = async_sessionmaker(
autocommit=False,
autoflush=False,
bind=async_engine,
expire_on_commit=True,
class_=AsyncSession
)
)
class Base(AsyncAttrs, DeclarativeBase):
@ -79,13 +90,13 @@ class Base(AsyncAttrs, DeclarativeBase):
async def db_getter() -> AsyncGenerator[AsyncSession, None]:
"""
获取主数据库
获取主数据库会话
数据库依赖项它将在单个请求中使用然后在请求完成后将其关闭
函数的返回类型被注解为 AsyncGenerator[int, None]其中 AsyncSession 是生成的值的类型 None 表示异步生成器没有终止条件
"""
async with create_async_engine_session(SQLALCHEMY_DATABASE_URL)() as session:
async with session_factory() as session:
# 创建一个新的事务,半自动 commit
async with session.begin():
yield session
@ -109,6 +120,8 @@ def mongo_getter(request: Request) -> AsyncIOMotorDatabase:
全局挂载使用一个数据库对象
"""
if not MONGO_DB_ENABLE:
raise CustomException(msg="请先开启 MongoDB 数据库连接!", desc="请启用 application/settings.py: MONGO_DB_ENABLE")
raise CustomException(
msg="请先开启 MongoDB 数据库连接!",
desc="请启用 application/settings.py: MONGO_DB_ENABLE"
)
return request.app.state.mongo