fix(analytics): 命中表索引幂等守卫独立+created_at 去掉 onupdate 语义
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -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"),
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user