From 8b29326b2ef23b8df91f14762ec4b2812e29b85b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Fri, 4 Sep 2026 15:30:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(analytics):=20=E5=91=BD=E4=B8=AD=E8=A1=A8?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E5=B9=82=E7=AD=89=E5=AE=88=E5=8D=AB=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B+created=5Fat=20=E5=8E=BB=E6=8E=89=20onupdate=20?= =?UTF-8?q?=E8=AF=AD=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- yunke-server/app/db/models.py | 12 ++++++++++-- .../versions/f0a1b2c3d4e5_analytics_module_tables.py | 7 ++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/yunke-server/app/db/models.py b/yunke-server/app/db/models.py index 28e8cef..420e77d 100644 --- a/yunke-server/app/db/models.py +++ b/yunke-server/app/db/models.py @@ -838,7 +838,11 @@ class SensitiveWord(Base): exclude_words: Mapped[list[Any] | dict[str, Any] | None] = mapped_column( JSON, nullable=True ) - created_at: Mapped[dt.datetime] = _updated_at() + # created_at 不用 _updated_at():无 onupdate,首次落库后不被静默重写 + # (T8 改词/T10 处置命中只该动 updated_at/disposition) + created_at: Mapped[dt.datetime] = mapped_column( + sa.DateTime, nullable=False, server_default=sa.func.now() + ) updated_at: Mapped[dt.datetime] = _updated_at() @@ -866,7 +870,11 @@ class SensitiveHit(Base): disposition: Mapped[str] = mapped_column( String(16), nullable=False, default="pending", server_default="pending" ) - created_at: Mapped[dt.datetime] = _updated_at() + # created_at 不用 _updated_at():无 onupdate,首次落库后不被静默重写 + # (T8 改词/T10 处置命中只该动 updated_at/disposition) + created_at: Mapped[dt.datetime] = mapped_column( + sa.DateTime, nullable=False, server_default=sa.func.now() + ) __table_args__ = ( sa.UniqueConstraint("word_id", "msg_id", name="uq_sensitive_hit_word_msg"), diff --git a/yunke-server/migrations/versions/f0a1b2c3d4e5_analytics_module_tables.py b/yunke-server/migrations/versions/f0a1b2c3d4e5_analytics_module_tables.py index e7783c3..c1bc89f 100644 --- a/yunke-server/migrations/versions/f0a1b2c3d4e5_analytics_module_tables.py +++ b/yunke-server/migrations/versions/f0a1b2c3d4e5_analytics_module_tables.py @@ -75,9 +75,10 @@ def upgrade() -> None: sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.now()), sa.UniqueConstraint("word_id", "msg_id", name="uq_sensitive_hit_word_msg"), ) - op.create_index( - "ix_sensitive_hit_disp_ts", "sensitive_hit", ["disposition", "ts"] - ) + # 索引守卫独立于建表:MySQL DDL 逐句自动提交,进程死在 create_table 与 + # create_index 之间的话,重跑会因表已存在而永远跳过索引。 + if not _has_index(bind, "sensitive_hit", "ix_sensitive_hit_disp_ts"): + op.create_index("ix_sensitive_hit_disp_ts", "sensitive_hit", ["disposition", "ts"]) if not insp.has_table("sensitive_scan_state"): op.create_table( "sensitive_scan_state",