From 389afe2f7bab59eabe8cb9addd40b5c4419b473c Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Mon, 31 Aug 2026 00:33:50 -0400 Subject: [PATCH] db: the doubled CHECK list was six, not four (#3275) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run 5029 confirmed the four renames landed and surfaced two I had missed: external_link's host and status CHECKs are doubled the same way. They did not show in run 5026's diff because BOTH sides produced the doubled form back then — external_link.py pre-prefixed its names, so the models matched the chain's mistake. Switching all six models to bare names is what exposed the two the migration did not cover. The list in the file now comes from matching ck_(\w+?)_ck_\1_ against the chain's own pg_dump, rather than from reading migrations by eye. Reading by eye is what missed these, in the same way it earlier missed a UNIQUE constraint sitting two lines above the index being looked at. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_017QHszn9H8VBvx5Ke8x1hvw --- .../0088_reconcile_models_with_schema.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/alembic/versions/0088_reconcile_models_with_schema.py b/alembic/versions/0088_reconcile_models_with_schema.py index 30020dc..d5b84c2 100644 --- a/alembic/versions/0088_reconcile_models_with_schema.py +++ b/alembic/versions/0088_reconcile_models_with_schema.py @@ -29,13 +29,15 @@ guarantee built from different objects, which is why the two schemas did not line up. The model now declares the constraint and the plain index separately, so it describes what is actually there. No DDL is needed for it. -Also here: four CHECK constraints whose names carry their table prefix TWICE. +Also here: six CHECK constraints whose names carry their table prefix TWICE. `base.py`'s naming convention is `ck_%(table_name)s_%(constraint_name)s`, and unlike the uq/fk/ix entries it applies even to a constraint that already has a -name. Four migrations passed an already-prefixed name, so the convention +name. Six migrations passed an already-prefixed name, so the convention prefixed it again: + ck_external_link_ck_external_link_host + ck_external_link_ck_external_link_status ck_import_settings_ck_import_settings_singleton ck_ml_settings_ck_ml_settings_singleton ck_post_ck_post_translation_override @@ -67,7 +69,17 @@ branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None # (table, doubled name, single-prefix name) +# +# Six, not the four a first read of the migrations turned up. The list that +# settles it is the one extracted from the chain's pg_dump by matching +# `ck_(\w+?)_ck_\1_` — reading the migrations by eye missed external_link +# twice over, in the same way an earlier pass missed a UNIQUE constraint two +# lines above the index it was looking at (see the sha256 note above). DOUBLED_CHECKS = ( + ("external_link", "ck_external_link_ck_external_link_host", + "ck_external_link_host"), + ("external_link", "ck_external_link_ck_external_link_status", + "ck_external_link_status"), ("import_settings", "ck_import_settings_ck_import_settings_singleton", "ck_import_settings_singleton"), ("ml_settings", "ck_ml_settings_ck_ml_settings_singleton",