From f30997c02a31e128aff9ac609f149e7e1b2204f9 Mon Sep 17 00:00:00 2001 From: renjianbo <18691577328@163.com> Date: Thu, 7 May 2026 23:08:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20schedule=5Fdelete=20=E5=A4=96=E9=94=AE?= =?UTF-8?q?=E7=BA=A6=E6=9D=9F=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - schedule_delete_tool 执行前先解除 executions.schedule_id 引用 - 迁移 012: executions.schedule_id FK 改为 ON DELETE SET NULL Co-Authored-By: Claude Opus 4.6 --- .../versions/012_schedule_fk_set_null.py | 43 +++++++++++++++++++ backend/app/services/builtin_tools.py | 11 +++++ 2 files changed, 54 insertions(+) create mode 100644 backend/alembic/versions/012_schedule_fk_set_null.py diff --git a/backend/alembic/versions/012_schedule_fk_set_null.py b/backend/alembic/versions/012_schedule_fk_set_null.py new file mode 100644 index 0000000..2fb28dc --- /dev/null +++ b/backend/alembic/versions/012_schedule_fk_set_null.py @@ -0,0 +1,43 @@ +"""alter executions.schedule_id FK to ON DELETE SET NULL + +Revision ID: 012_schedule_fk_set_null +Revises: 011_add_agent_market_fields +Create Date: 2026-05-07 +""" +from alembic import op + +revision = "012_schedule_fk_set_null" +down_revision = "011_add_agent_market_fields" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + """将 executions.schedule_id 外键改为 SET NULL,删除定时任务时自动保留执行记录。""" + try: + op.drop_constraint("executions_ibfk_3", "executions", type_="foreignkey") + except Exception: + # FK name may vary; try alternate patterns + try: + op.drop_constraint("executions_ibfk_4", "executions", type_="foreignkey") + except Exception: + pass + op.create_foreign_key( + "executions_ibfk_3", + "executions", "agent_schedules", + ["schedule_id"], ["id"], + ondelete="SET NULL", + ) + + +def downgrade() -> None: + try: + op.drop_constraint("executions_ibfk_3", "executions", type_="foreignkey") + except Exception: + pass + op.create_foreign_key( + "executions_ibfk_3", + "executions", "agent_schedules", + ["schedule_id"], ["id"], + ondelete="RESTRICT", + ) diff --git a/backend/app/services/builtin_tools.py b/backend/app/services/builtin_tools.py index bc49cc7..11cad43 100644 --- a/backend/app/services/builtin_tools.py +++ b/backend/app/services/builtin_tools.py @@ -1894,6 +1894,11 @@ async def schedule_delete_tool( }, ensure_ascii=False) name = schedule.name + # 先将引用此 schedule 的 execution 记录的 schedule_id 置空,避免外键约束 + from app.models.execution import Execution + db.query(Execution).filter(Execution.schedule_id == schedule_id).update( + {Execution.schedule_id: None}, synchronize_session=False + ) db.delete(schedule) db.commit() db.close() @@ -1915,6 +1920,12 @@ async def schedule_delete_tool( names = [s.name for s in schedules] count = len(schedules) + # 先解除所有 execution 记录的 schedule_id 外键引用 + from app.models.execution import Execution + sids = [s.id for s in schedules] + db.query(Execution).filter(Execution.schedule_id.in_(sids)).update( + {Execution.schedule_id: None}, synchronize_session=False + ) for s in schedules: db.delete(s) db.commit()