更新table_base到最新版本
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# ~/models/database.py
|
||||
from contextlib import asynccontextmanager
|
||||
from typing import AsyncGenerator
|
||||
from typing import AsyncGenerator, ClassVar
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
|
||||
@@ -29,20 +29,34 @@ engine: AsyncEngine = create_async_engine(
|
||||
# max_overflow=64,
|
||||
)
|
||||
|
||||
_async_session_factory = sessionmaker(
|
||||
engine, class_=AsyncSession, expire_on_commit=False
|
||||
)
|
||||
_async_session_factory = sessionmaker(engine, class_=AsyncSession)
|
||||
|
||||
|
||||
# 数据库类
|
||||
class Database:
|
||||
# Database 初始化方法
|
||||
"""
|
||||
数据库管理类(单例模式)
|
||||
|
||||
从 foxline 项目移植的改进版本,支持:
|
||||
- ClassVar 单例模式
|
||||
- 触发器 SQL 支持
|
||||
- 优雅关闭
|
||||
"""
|
||||
engine: ClassVar[AsyncEngine | None] = None
|
||||
_async_session_factory: ClassVar[sessionmaker | None] = None
|
||||
|
||||
def __init__(
|
||||
self, # self 用于引用类的实例
|
||||
self,
|
||||
db_path: str = "data.db", # db_path 数据库文件路径,默认为 data.db
|
||||
):
|
||||
# 保持向后兼容:实例化时使用全局 engine
|
||||
self.db_path = db_path
|
||||
|
||||
@classmethod
|
||||
def get_engine(cls) -> AsyncEngine:
|
||||
"""获取数据库引擎"""
|
||||
return engine
|
||||
|
||||
@staticmethod
|
||||
async def get_session() -> AsyncGenerator[AsyncSession, None]:
|
||||
"""FastAPI dependency to get a database session."""
|
||||
@@ -54,7 +68,7 @@ class Database:
|
||||
async def session_context() -> AsyncGenerator[AsyncSession, None]:
|
||||
"""
|
||||
提供异步上下文管理器用于直接获取数据库会话
|
||||
|
||||
|
||||
使用示例:
|
||||
>>> async with Database.session_context() as session:
|
||||
# 执行数据库操作
|
||||
@@ -63,11 +77,39 @@ class Database:
|
||||
async with _async_session_factory() as session:
|
||||
yield session
|
||||
|
||||
async def init_db(self):
|
||||
"""创建数据库结构"""
|
||||
async def init_db(
|
||||
self,
|
||||
trigger_sqls: list[tuple[str, str, str]] | None = None,
|
||||
):
|
||||
"""
|
||||
创建数据库结构
|
||||
|
||||
Args:
|
||||
trigger_sqls: 触发器SQL语句列表,每个元素为 (function_sql, drop_trigger_sql, create_trigger_sql)
|
||||
"""
|
||||
async with engine.begin() as conn:
|
||||
await conn.run_sync(SQLModel.metadata.create_all)
|
||||
|
||||
# 创建触发器(如果提供)
|
||||
if trigger_sqls:
|
||||
for function_sql, drop_trigger_sql, create_trigger_sql in trigger_sqls:
|
||||
await conn.exec_driver_sql(function_sql)
|
||||
await conn.exec_driver_sql(drop_trigger_sql)
|
||||
await conn.exec_driver_sql(create_trigger_sql)
|
||||
|
||||
# For internal use, create a temporary context manager
|
||||
async with self.session_context() as session:
|
||||
await migration(session) # 执行迁移脚本
|
||||
|
||||
@classmethod
|
||||
async def close(cls):
|
||||
"""
|
||||
优雅地关闭数据库连接引擎。
|
||||
|
||||
仅应在应用结束时调用。
|
||||
|
||||
这会释放引擎维护的所有数据库连接池资源。
|
||||
在应用程序关闭时调用此方法是一个好习惯。
|
||||
"""
|
||||
if engine:
|
||||
await engine.dispose()
|
||||
|
||||
Reference in New Issue
Block a user