Files
MoviePilot/app/db/plugin/base.py
Aqr-K 22e4439bd9 feat(db): 新增按插件隔离的自管理数据库框架
新增 app/db/plugin 包(base/container/locator/migration/registry),
以独立 MetaData、独立 SQLite 库文件或 PostgreSQL schema 隔离插件自有表;
从 app/db/engine.py 抽出 build_sqlite_engine/apply_sqlite_journal_mode 供
宿主引擎与插件引擎共用同一套连接语义;close_database 在宿主引擎释放前先
释放全部插件数据库连接。框架本身尚无调用方,可独立测试。
2026-09-02 02:14:19 -04:00

25 lines
889 B
Python

"""插件专属声明式基类工厂。"""
from __future__ import annotations
from sqlalchemy.orm import DeclarativeBase
__all__ = ["plugin_declarative_base"]
def plugin_declarative_base() -> type[DeclarativeBase]:
"""
产出携带全新 ``MetaData`` 的声明式基类。
插件模型继承本函数的返回值定义,其表便注册在独立的 ``MetaData`` 上:既不与宿主
``app.db.base.Base`` 抢同一份注册表,也允许两个插件各自定义同名表。插件热重载会
重新执行插件模块、重新调用本函数,因此每次都拿到干净的注册表,不会在同一
``MetaData`` 上重复定义同名表而报错。
:return: 声明式基类
"""
class PluginBase(DeclarativeBase): # type: ignore[misc] # SQLAlchemy 无 py.typed 基类
"""插件自有表的声明式基类。"""
return PluginBase