From ecc3178c3d895d5f9de85f3b616af3813db20d84 Mon Sep 17 00:00:00 2001 From: Wilfred Tyler Gee Date: Mon, 22 Dec 2025 13:15:52 -1000 Subject: [PATCH] Remove redundant constraints - tickets/INSTRM-2823 * Removes unique constraints from the largest tables. * Quick README update. --- README.md | 2 +- ...bf1_remove_redundant_unique_constraints.py | 124 ++++++++++++++++++ python/opdb/models.py | 14 +- 3 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 alembic/opdb_summit/alembic/versions/26a4e346fbf1_remove_redundant_unique_constraints.py diff --git a/README.md b/README.md index f754e84..02dc58e 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ __Note that contact opDB manager if you make a new directory__ * make `db.cfg` in the directory where `alembic.ini` exists. This file contains the following string: ```sh -postgres://username:password@hostname:port/dbname +postgresql://username:password@hostname:port/dbname ``` __Note that DO NOT commit `db.cfg` on the repository__ diff --git a/alembic/opdb_summit/alembic/versions/26a4e346fbf1_remove_redundant_unique_constraints.py b/alembic/opdb_summit/alembic/versions/26a4e346fbf1_remove_redundant_unique_constraints.py new file mode 100644 index 0000000..7a14dde --- /dev/null +++ b/alembic/opdb_summit/alembic/versions/26a4e346fbf1_remove_redundant_unique_constraints.py @@ -0,0 +1,124 @@ +"""Remove redundant unique constraints + +Revision ID: 26a4e346fbf1 +Revises: 06febe7976d8 +Create Date: 2025-12-22 12:13:14.382321 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = '26a4e346fbf1' +down_revision = '06febe7976d8' +branch_labels = None +depends_on = None + +drop_constraints = [ + [ + "agc_data", # Table + "agc_data_agc_exposure_id_agc_camera_id_spot_id_key", # Constraint name + ['agc_exposure_id', 'agc_camera_id', 'spot_id'], # Columns + [("agc_match", "agc_match_agc_exposure_id_fkey")] # Dependent foreign keys + ], + [ + "agc_match", + "agc_match_agc_exposure_id_agc_camera_id_spot_id_key", + ["agc_exposure_id", "agc_camera_id", "spot_id"], + [] + ], + [ + "cobra_match", + "cobra_match_pfs_visit_id_iteration_cobra_id_key", + ["pfs_visit_id", 'iteration', 'cobra_id'], + [("cobra_move", "cobra_move_pfs_visit_id_fkey"), ] + ], + [ + "cobra_move", + "cobra_move_pfs_visit_id_iteration_cobra_id_key", + ["pfs_visit_id", "iteration", "cobra_id"], + [] + ], + [ + "cobra_target", + "cobra_target_pfs_visit_id_iteration_cobra_id_key", + ["pfs_visit_id", "iteration", "cobra_id"], + [("cobra_match", "cobra_match_pfs_visit_id_fkey")] + ], + [ + "mcs_data", + "mcs_data_mcs_frame_id_spot_id_key", + ["mcs_frame_id", "spot_id"], + [ + ("cobra_match", "cobra_match_mcs_frame_id_fkey"), + ("fiducial_fiber_match", "fiducial_fiber_match_mcs_frame_id_fkey") + ] + ], +] + + +def upgrade(): + for constraint in drop_constraints: + table_name = constraint[0] + constraint_name = constraint[1] + columns = constraint[2] + foreign_keys = constraint[3] + # Drop dependent foreign key constraints first + for fk in foreign_keys: + fk_table = fk[0] + fk_constraint_name = fk[1] + op.drop_constraint( + fk_constraint_name, + fk_table, + type_='foreignkey', + ) + # Now drop the unique constraint + op.drop_constraint( + constraint_name, + table_name, + type_='unique', + ) + # Recreate dependent foreign key constraints + for fk in foreign_keys: + fk_table = fk[0] + fk_constraint_name = fk[1] + op.create_foreign_key( + fk_constraint_name, + fk_table, + table_name, + local_cols=columns, + remote_cols=columns, + ) + + +def downgrade(): + for constraint in drop_constraints: + table_name = constraint[0] + constraint_name = constraint[1] + columns = constraint[2] + foreign_keys = constraint[3] + # Drop dependent foreign key constraints first + for fk in foreign_keys: + fk_table = fk[0] + fk_constraint_name = fk[1] + op.drop_constraint( + fk_constraint_name, + fk_table, + type_='foreignkey', + ) + # Recreate the unique constraint + op.create_unique_constraint( + constraint_name, + table_name, + columns, + ) + # Recreate dependent foreign key constraints + for fk in foreign_keys: + fk_table = fk[0] + fk_constraint_name = fk[1] + op.create_foreign_key( + fk_constraint_name, + fk_table, + table_name, + local_cols=columns, + remote_cols=columns, + ) diff --git a/python/opdb/models.py b/python/opdb/models.py index 991b998..9d4c66e 100644 --- a/python/opdb/models.py +++ b/python/opdb/models.py @@ -677,7 +677,6 @@ class mcs_data(Base): ''' __tablename__ = 'mcs_data' - __table_args__ = (UniqueConstraint('mcs_frame_id', 'spot_id'), {}) mcs_frame_id = Column(Integer, ForeignKey('mcs_exposure.mcs_frame_id'), primary_key=True, index=True, autoincrement=False) @@ -1091,8 +1090,6 @@ class cobra_target(Base): ''' The actual movement of the cobra motor, in terms of individual MCS frames. ''' __tablename__ = 'cobra_target' - __table_args__ = (UniqueConstraint('pfs_visit_id', 'iteration', 'cobra_id'), - {}) pfs_visit_id = Column(Integer, ForeignKey('pfs_visit.pfs_visit_id'), primary_key=True, unique=False, autoincrement=False, @@ -1137,8 +1134,7 @@ class cobra_move(Base): ''' The actual movement of the cobra motor, in terms of individual MCS frames. ''' __tablename__ = 'cobra_move' - __table_args__ = (UniqueConstraint('pfs_visit_id', 'iteration', 'cobra_id'), - ForeignKeyConstraint(['pfs_visit_id', 'iteration', 'cobra_id'], + __table_args__ = (ForeignKeyConstraint(['pfs_visit_id', 'iteration', 'cobra_id'], ['cobra_match.pfs_visit_id', 'cobra_match.iteration', 'cobra_match.cobra_id']), {}) @@ -1190,8 +1186,7 @@ class cobra_match(Base): '''Defines the status of each cobra at each step during convergence. ''' __tablename__ = 'cobra_match' - __table_args__ = (UniqueConstraint('pfs_visit_id', 'iteration', 'cobra_id'), - ForeignKeyConstraint(['pfs_visit_id', 'iteration', 'cobra_id'], + __table_args__ = (ForeignKeyConstraint(['pfs_visit_id', 'iteration', 'cobra_id'], ['cobra_target.pfs_visit_id', 'cobra_target.iteration', 'cobra_target.cobra_id']), ForeignKeyConstraint(['mcs_frame_id', 'spot_id'], ['mcs_data.mcs_frame_id', 'mcs_data.spot_id']), @@ -1720,8 +1715,6 @@ class agc_data(Base): ''' __tablename__ = 'agc_data' - __table_args__ = (UniqueConstraint('agc_exposure_id', 'agc_camera_id', 'spot_id'), - {}) agc_exposure_id = Column(Integer, ForeignKey('agc_exposure.agc_exposure_id'), primary_key=True, autoincrement=False, @@ -1773,8 +1766,7 @@ class agc_match(Base): ''' __tablename__ = 'agc_match' - __table_args__ = (UniqueConstraint('agc_exposure_id', 'agc_camera_id', 'spot_id'), - ForeignKeyConstraint(['agc_exposure_id', 'agc_camera_id', 'spot_id'], + __table_args__ = (ForeignKeyConstraint(['agc_exposure_id', 'agc_camera_id', 'spot_id'], ['agc_data.agc_exposure_id', 'agc_data.agc_camera_id', 'agc_data.spot_id']), {})