feat(db): P2 摘除运行时种子 + 脚本化迁移/种子(migrate.py/seed.py)
- Database.initialize() 不再 create_all/seed_data:运行时仅做库连通检查(不建表不灌种子)。 - 新增 scripts/db/migrate.py(封装 alembic upgrade/downgrade)、scripts/db/seed.py(非运行态灌平台种子)。 - 新增 serverdata/seed/(README) 存放种子 JSON。 - 迁移/种子流程:uv run python scripts/db/migrate.py + scripts/db/seed.py,再启动应用。 - 已知待修:seed 内 AGENT_SEED 全局固定 id 唯一冲突(既有缺陷, 待 P2 后续修);pine/角色已能灌入。
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""数据库种子脚本(非运行态)—— 在迁移后、启动应用前执行。
|
||||
|
||||
用法:uv run python scripts/db/seed.py
|
||||
职责:灌入平台/园区/培训的基础种子数据(角色、权限、用户、默认园区、培训事件课程等)。
|
||||
全部幂等(按标记行判断,重跑安全)。禁止在应用启动时调用本逻辑。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import logging
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent))
|
||||
|
||||
from app.infrastructure.repositories import Database
|
||||
from app.infrastructure.seed import seed_data as platform_seed
|
||||
from app import config
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format="%(levelname)s %(name)s: %(message)s")
|
||||
log = logging.getLogger("db.seed")
|
||||
|
||||
|
||||
async def run() -> None:
|
||||
db = Database()
|
||||
try:
|
||||
# 平台种子(角色/权限/用户/政务/OPC/投资人/工作台等,幂等)
|
||||
await platform_seed(db.session)
|
||||
await db.session.commit()
|
||||
log.info("平台种子完成:%s", config.DATABASE_URL)
|
||||
# TODO(P2/P3 后):园区默认园区+企业、培训事件课程 经 serverdata/seed/*.json 灌入(当前由各自子应用迁移后接入)
|
||||
except Exception as e: # noqa: BLE001
|
||||
await db.session.rollback()
|
||||
log.error("种子失败:%s", e)
|
||||
raise
|
||||
finally:
|
||||
await db.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(run())
|
||||
Reference in New Issue
Block a user