refactor(training): 培训数据层并入唯一总库 app.db(非运行态建表/种子,全列可空)
- 训练 ORM 模型改名回旧表名(accounts/events/bookings/tests/courses/policy_logs/plan_logs/survey_logs) 并全列可空(兼容按部分字段插入);alembic 0003 丢弃重建并入唯一总库。 - training/db.py 指向 app.db、移除运行时 init_db;main.py lifespan 移除 init_db。 - seed.py 增培训种子(超管账号/排期/在线课程, 幂等)。 - 验证(真实库 migrate+seed+TestClient):auth/me、admin/*、park/*、training /api/health|events|courses 全 200。
This commit is contained in:
+25
-2
@@ -23,14 +23,37 @@ logging.basicConfig(level=logging.INFO, format="%(levelname)s %(name)s: %(messag
|
||||
log = logging.getLogger("db.seed")
|
||||
|
||||
|
||||
def _seed_training() -> None:
|
||||
"""培训种子(唯一总库 app.db):超管账号 + 排期 + 在线课程(幂等)。"""
|
||||
import sqlite3
|
||||
import json
|
||||
from app.training import db as tdb
|
||||
conn = sqlite3.connect(tdb.DB_PATH)
|
||||
conn.row_factory = sqlite3.Row
|
||||
try:
|
||||
if conn.execute("SELECT COUNT(*) AS c FROM accounts").fetchone()["c"] == 0:
|
||||
from app.training.auth import hash_password
|
||||
conn.execute("INSERT INTO accounts (id,username,password,name,identities,created_at) VALUES (?,?,?,?,?,?)",
|
||||
("U-PINE", "pine", hash_password("123456"), "Pine", json.dumps(["admin"]), tdb.now_iso()))
|
||||
if conn.execute("SELECT COUNT(*) AS c FROM events").fetchone()["c"] == 0:
|
||||
for e in tdb.SEED_EVENTS:
|
||||
conn.execute("INSERT INTO events (id,type,mode,title,subtitle,desc,location,host,image,link,start_at,duration_min,capacity,status) VALUES (:id,:type,:mode,:title,:subtitle,:desc,:location,:host,:image,:link,:start_at,:duration_min,:capacity,:status)", e)
|
||||
if conn.execute("SELECT COUNT(*) AS c FROM courses").fetchone()["c"] == 0:
|
||||
for c in tdb.SEED_COURSES:
|
||||
conn.execute("INSERT INTO courses (id,category,level,title,subtitle,desc,price,status,start_at,end_at,venue,quota,image,host,created_at) VALUES (:id,:category,:level,:title,:subtitle,:desc,:price,:status,:start_at,:end_at,:venue,:quota,:image,:host,:created_at)", c)
|
||||
conn.commit()
|
||||
log.info("培训种子完成(账号/排期/课程)")
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
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 灌入(当前由各自子应用迁移后接入)
|
||||
_seed_training()
|
||||
except Exception as e: # noqa: BLE001
|
||||
await db.session.rollback()
|
||||
log.error("种子失败:%s", e)
|
||||
|
||||
Reference in New Issue
Block a user