feat(park): 视频识别剥离,per-tenant 配置接入 park-vision 独立服务
- 删除 vision_yolo/vision_llm 及路由 /api/vision/frame|llm(保留遥测 event),去除 ultralytics 依赖 - 视频识别改为每园区(per-tenant)配置,经 park_settings(kv) 键 vision_api:<tid> 存取 - /park/api/vision/config GET/PUT(园区端读写本园区识别地址,可局域网);bind 下发含 vision_api - 新增 alembic 0004(tenant_id 可空) / 0005(park_settings 表),迁移脚本执行
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
"""park_screens.tenant_id 改为可空(纠正早期 create_all 遗留的 NOT NULL)
|
||||
|
||||
Revision ID: 0004_park_screen_nullable_tenant
|
||||
Revises: 0003_training_tables
|
||||
Create Date: 2026-08-24
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision = "0004_park_screen_nullable_tenant"
|
||||
down_revision = "0003_training_tables"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# SQLite 不能直接 ALTER 去除 NOT NULL → 用 batch(内部 rename+copy 重建表,保留既有行)
|
||||
with op.batch_alter_table("park_screens") as batch_op:
|
||||
batch_op.alter_column(
|
||||
"tenant_id",
|
||||
existing_type=sa.String(),
|
||||
nullable=True,
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# 回退:恢复 NOT NULL(如无数据则安全;有数据且为 NULL 时需先处理)
|
||||
with op.batch_alter_table("park_screens") as batch_op:
|
||||
batch_op.alter_column(
|
||||
"tenant_id",
|
||||
existing_type=sa.String(),
|
||||
nullable=False,
|
||||
)
|
||||
@@ -0,0 +1,30 @@
|
||||
"""park_settings 全局配置 kv 表(视频识别开关/地址等,admin 可写)
|
||||
|
||||
Revision ID: 0005_park_settings
|
||||
Revises: 0004_park_screen_nullable_tenant
|
||||
Create Date: 2026-08-24
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision = "0005_park_settings"
|
||||
down_revision = "0004_park_screen_nullable_tenant"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
conn = op.get_bind()
|
||||
if not conn.dialect.has_table(conn, "park_settings"):
|
||||
op.create_table(
|
||||
"park_settings",
|
||||
sa.Column("key", sa.String(), primary_key=True),
|
||||
sa.Column("value", sa.Text(), nullable=False, server_default=""),
|
||||
sa.Column("updated_at", sa.String(), nullable=False, server_default=""),
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_table("park_settings")
|
||||
Reference in New Issue
Block a user