kinit/kinit-api/core/database.py
ktianc c65ff06918 版本升级:
1. 修复(kinit-api):utils/cache.py 日志模块导入问题修复
2. 修复(kinit-api):token解析失败会报错问题修复
3. 优化(kinit-api):用户登录认证失败返回值优化
4. 优化(kinit-api):获取redis方式统一改为redis_getter(request)
5. 优化(kini-api):文件IO修改为异步操作
6. 优化(kinit-api):关联创建人时将user_id改为create_user_id
7. 文档(kinit-api):kinit-api/README.md 加入查询数据文档
8. 修复(kinit-admin):用户无法导出问题修复
9. 优化(kinit-admin):角色新增与编辑框使用默认父子联动
10. 更新(kinit-admin):usePermissionStore 改为 useRouterStoreWithOut,因为此文件主要记录路由
11. 更新(kinit-admin):取消用户信息的持久化存储,改为仅保存在pinia store共享中,并添加roles,permissions信息
12. 修复(kinit-admin):菜单新增与编辑框,目录与菜单切换时会出现抖动问题修复
13. 优化(kinit-admin):src\hooks\web\useTable.ts 优化删除数据方法
14. 优化(kinit-admin):config/services.ts 新增返回403状态码时直接退出系统
15. 优化(kinit-admin):将store中的本文件使用store调用的,改为this
16. 更新(kinit-admin):路由拦截更新
17. 更新(kinit-api,kinit-admin,kinit-uni):取消接口地址最后面的 /
2023-05-14 23:21:00 +08:00

103 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# @version : 1.0
# @Create Time : 2021/10/18 22:19
# @File : database.py
# @IDE : PyCharm
# @desc : SQLAlchemy 部分
"""
导入 SQLAlchemy 部分
安装: pip install sqlalchemy
中文文档https://www.osgeo.cn/sqlalchemy/
"""
from aioredis import Redis
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.ext.declarative import declared_attr, declarative_base
from sqlalchemy.orm import sessionmaker
from application.settings import SQLALCHEMY_DATABASE_URL, REDIS_DB_ENABLE
from fastapi import Request
from core.exception import CustomException
def create_async_engine_session(database_url: str):
"""
创建数据库会话
相关配置文档https://docs.sqlalchemy.org/en/14/core/engines.html#database-urls
database_url dialect+driver://username:password@host:port/database
max_overflow 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=20, # 池中没有连接最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
:param database_url: 数据库地址
:return:
"""
engine = create_async_engine(
database_url,
echo=False,
pool_pre_ping=True,
pool_recycle=3600,
future=True,
max_overflow=5,
connect_args={}
)
return sessionmaker(autocommit=False, autoflush=False, bind=engine, expire_on_commit=True, class_=AsyncSession)
class Base:
"""将表名改为小写"""
@declared_attr
def __tablename__(self):
# 如果有自定义表名就取自定义,没有就取小写类名
table_name = self.__tablename__
if not table_name:
model_name = self.__name__
ls = []
for index, char in enumerate(model_name):
if char.isupper() and index != 0:
ls.append("_")
ls.append(char)
table_name = "".join(ls).lower()
return table_name
"""
创建基本映射类
稍后,我们将继承该类,创建每个 ORM 模型
"""
Model = declarative_base(name='Model', cls=Base)
""" 附上两个SQLAlchemy教程
Python3+SQLAlchemy+Sqlite3实现ORM教程
https://www.cnblogs.com/jiangxiaobo/p/12350561.html
SQLAlchemy基础知识 Autoflush和Autocommit
https://www.jianshu.com/p/b219c3dd4d1e
"""
async def db_getter():
"""
获取主数据库
数据库依赖项,它将在单个请求中使用,然后在请求完成后将其关闭。
"""
async with create_async_engine_session(SQLALCHEMY_DATABASE_URL)() as session:
async with session.begin():
yield session
def redis_getter(request: Request) -> Redis:
"""
获取关系数据库
数据库依赖项,它将在单个请求中使用,然后在请求完成后将其关闭。
"""
if not REDIS_DB_ENABLE:
raise CustomException("请先配置Redis数据库链接并启用", desc="请启用 application/settings.py: REDIS_DB_ENABLE")
return request.app.state.redis