Skip to content

Commit 660da94

Browse files
committed
Merge branch 'v2.0' into master
2 parents 721796d + 6148c73 commit 660da94

5 files changed

Lines changed: 71 additions & 7 deletions

File tree

api/alembic/versions/0003_task_timeout.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@
1717

1818

1919
def upgrade() -> None:
20-
op.add_column(
21-
'task',
22-
sa.Column('timeout', sa.Integer(), nullable=True, server_default='0',
23-
comment='任务超时(秒):0=用全局默认,-1=不限(流式/超长),>0=自定义'),
24-
)
20+
# 幂等:列已存在(如从含该列的 ezdata.sql 建库)则跳过,便于 stamp 基线后重跑
21+
bind = op.get_bind()
22+
cols = [c['name'] for c in sa.inspect(bind).get_columns('task')]
23+
if 'timeout' not in cols:
24+
op.add_column(
25+
'task',
26+
sa.Column('timeout', sa.Integer(), nullable=True, server_default='0',
27+
comment='任务超时(秒):0=用全局默认,-1=不限(流式/超长),>0=自定义'),
28+
)
2529

2630

2731
def downgrade() -> None:

api/alembic/versions/0004_datasource_remark_text.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717

1818

1919
def upgrade() -> None:
20-
op.alter_column('data_source', 'remark', existing_type=sa.String(length=500),
21-
type_=sa.Text(), existing_nullable=True)
20+
# 幂等:已是 TEXT(如从含该改动的 ezdata.sql 建库)则跳过
21+
bind = op.get_bind()
22+
col = next((c for c in sa.inspect(bind).get_columns('data_source') if c['name'] == 'remark'), None)
23+
if col is not None and 'text' not in str(col['type']).lower():
24+
op.alter_column('data_source', 'remark', existing_type=sa.String(length=500),
25+
type_=sa.Text(), existing_nullable=True)
2226

2327

2428
def downgrade() -> None:

api/config/get_db.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ async def init_create_table() -> None:
2727
:return:
2828
"""
2929
logger.info('🔎 初始化数据库连接...')
30+
# 可选:启动时自动 alembic 迁移(AUTO_MIGRATE=true 才执行,默认关);先于 create_all 跑,先改表结构再建缺失表。
31+
from fastapi.concurrency import run_in_threadpool # noqa: PLC0415
32+
33+
from config.migrate import run_auto_migrate # noqa: PLC0415
34+
35+
await run_in_threadpool(run_auto_migrate)
3036
async with async_engine.begin() as conn:
3137
await conn.run_sync(Base.metadata.create_all)
3238
logger.info('✅️ 数据库连接成功')

api/config/migrate.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
"""可选:启动时自动执行 alembic 迁移(默认关,`AUTO_MIGRATE=true` 开启)。
2+
3+
背景:本项目库多由 `*.sql` 初始化、**不在 alembic 管控下**(无 alembic_version 表)。直接
4+
`alembic upgrade head` 会从 0001_baseline 重跑建表而报错。故本模块:
5+
1) 已纳管(有 alembic_version)→ 直接 `upgrade head`;
6+
2) 未纳管 → 先 `stamp` 到基线(`AUTO_MIGRATE_BASELINE`,默认 `0002_seed_system`,即 ezdata.sql 对应的
7+
"建表+种子"状态)再 `upgrade head`。配合幂等迁移(add/alter 前查存在性),无论新库/滞后库都安全。
8+
迁移失败只记日志、**不阻断启动**。
9+
"""
10+
11+
import os
12+
13+
from utils.log_util import logger
14+
15+
16+
def _truthy(v: str | None) -> bool:
17+
return str(v or '').strip().lower() in ('1', 'true', 'yes', 'on')
18+
19+
20+
def run_auto_migrate() -> None:
21+
"""按 AUTO_MIGRATE 开关执行 alembic 迁移(同步阻塞,由调用方 threadpool 包裹)。"""
22+
if not _truthy(os.getenv('AUTO_MIGRATE')):
23+
return
24+
try:
25+
from alembic import command # noqa: PLC0415
26+
from alembic.config import Config # noqa: PLC0415
27+
from alembic.runtime.migration import MigrationContext # noqa: PLC0415
28+
from sqlalchemy import create_engine # noqa: PLC0415
29+
30+
from config.database import SYNC_SQLALCHEMY_DATABASE_URL # noqa: PLC0415
31+
32+
eng = create_engine(SYNC_SQLALCHEMY_DATABASE_URL)
33+
try:
34+
with eng.connect() as conn:
35+
current = MigrationContext.configure(conn).get_current_revision()
36+
finally:
37+
eng.dispose()
38+
39+
cfg = Config('alembic.ini')
40+
if current is None: # 库未纳入 alembic:先标记到基线,避免从 baseline 重跑
41+
baseline = (os.getenv('AUTO_MIGRATE_BASELINE') or '0002_seed_system').strip()
42+
logger.info(f'🔖 AUTO_MIGRATE: 库未纳入 alembic,先 stamp 到 {baseline}')
43+
command.stamp(cfg, baseline)
44+
logger.info('⛓️ AUTO_MIGRATE: alembic upgrade head …')
45+
command.upgrade(cfg, 'head')
46+
logger.info('✅️ AUTO_MIGRATE: 迁移完成')
47+
except Exception as e: # noqa: BLE001
48+
logger.error(f'❌ AUTO_MIGRATE 迁移失败(不阻断启动,可手动处理): {e}')

docs/DEPLOY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ dev 源码挂载,改完代码后端自动 reload;worker 需 `docker restart ezda
272272

273273
> ⚠️ 新代码会查询新列,**先补列、再上带新代码的镜像**(同一维护窗口);列缺失会导致相关查询报错。
274274
275+
**可选:启动时自动迁移** —— 设环境变量 **`AUTO_MIGRATE=true`**(默认关),后端启动时会自动 `alembic upgrade head`,省去手动。对"未纳入 alembic 的库(无 `alembic_version`,由 `*.sql` 建库)"会**先 stamp 基线再 upgrade**:基线由 `AUTO_MIGRATE_BASELINE` 控制(默认 `0002_seed_system`,即 `ezdata.sql` 对应的建表+种子状态)。迁移做了**幂等**(加列/改类型前查存在性),故对全新库(已含新列)、滞后库、已纳管库都安全;迁移失败只记日志、**不阻断启动**。滞后很多的库若基线不是 0002,把 `AUTO_MIGRATE_BASELINE` 设成它实际对应的版本即可。
276+
275277
---
276278

277279
## 10. 安全加固(对外部署)

0 commit comments

Comments
 (0)