diff --git a/src/shared/database/init_db.py b/src/shared/database/init_db.py index c0c9a4c..b81210c 100644 --- a/src/shared/database/init_db.py +++ b/src/shared/database/init_db.py @@ -35,11 +35,15 @@ async def _run_alembic_migrations() -> None: - 既有但无 alembic_version(历史 DB):先 stamp head 基线,再 upgrade(no-op) """ async with db_manager.engine.begin() as conn: - has_alembic = await conn.execute(text("SELECT to_regclass('public.alembic_version')")).scalar() + # 注意括号:await 优先级低于属性访问,await conn.execute(...).scalar() + # 实际是 await (conn.execute(...).scalar())——会在协程对象上调 .scalar() + # 直接 AttributeError。必须 (await conn.execute(...)).scalar()。 + # 曾因漏括号让启动迁移自诞生起一次都没跑通过(2026-09-26 事故根因)。 + has_alembic = (await conn.execute(text("SELECT to_regclass('public.alembic_version')"))).scalar() if not has_alembic: - table_count = await conn.execute( + table_count = (await conn.execute( text("SELECT count(*) FROM information_schema.tables WHERE table_schema='public' AND table_name <> 'alembic_version'") - ).scalar() + )).scalar() if table_count and table_count > 0: logger.info("检测到既有 DB 未纳入 alembic 管理,自动 stamp head 作为基线") await asyncio.to_thread(_alembic_stamp_head)