diff --git a/backend/alembic/versions/f7505c5b0284_updated_constraints_for_ccpairs.py b/backend/alembic/versions/f7505c5b0284_updated_constraints_for_ccpairs.py new file mode 100644 index 000000000..3e8935a67 --- /dev/null +++ b/backend/alembic/versions/f7505c5b0284_updated_constraints_for_ccpairs.py @@ -0,0 +1,77 @@ +"""updated constraints for ccpairs + +Revision ID: f7505c5b0284 +Revises: 6a804aeb4830 +Create Date: 2025-04-01 17:50:42.504818 + +""" +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "f7505c5b0284" +down_revision = "6a804aeb4830" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # 1) Drop the old foreign-key constraints + op.drop_constraint( + "document_by_connector_credential_pair_connector_id_fkey", + "document_by_connector_credential_pair", + type_="foreignkey", + ) + op.drop_constraint( + "document_by_connector_credential_pair_credential_id_fkey", + "document_by_connector_credential_pair", + type_="foreignkey", + ) + + # 2) Re-add them with ondelete='CASCADE' + op.create_foreign_key( + "document_by_connector_credential_pair_connector_id_fkey", + source_table="document_by_connector_credential_pair", + referent_table="connector", + local_cols=["connector_id"], + remote_cols=["id"], + ondelete="CASCADE", + ) + op.create_foreign_key( + "document_by_connector_credential_pair_credential_id_fkey", + source_table="document_by_connector_credential_pair", + referent_table="credential", + local_cols=["credential_id"], + remote_cols=["id"], + ondelete="CASCADE", + ) + + +def downgrade() -> None: + # Reverse the changes for rollback + op.drop_constraint( + "document_by_connector_credential_pair_connector_id_fkey", + "document_by_connector_credential_pair", + type_="foreignkey", + ) + op.drop_constraint( + "document_by_connector_credential_pair_credential_id_fkey", + "document_by_connector_credential_pair", + type_="foreignkey", + ) + + # Recreate without CASCADE + op.create_foreign_key( + "document_by_connector_credential_pair_connector_id_fkey", + "document_by_connector_credential_pair", + "connector", + ["connector_id"], + ["id"], + ) + op.create_foreign_key( + "document_by_connector_credential_pair_credential_id_fkey", + "document_by_connector_credential_pair", + "credential", + ["credential_id"], + ["id"], + ) diff --git a/backend/onyx/db/models.py b/backend/onyx/db/models.py index 7ed6a8884..c9ffd2598 100644 --- a/backend/onyx/db/models.py +++ b/backend/onyx/db/models.py @@ -703,7 +703,11 @@ class Connector(Base): ) documents_by_connector: Mapped[ list["DocumentByConnectorCredentialPair"] - ] = relationship("DocumentByConnectorCredentialPair", back_populates="connector") + ] = relationship( + "DocumentByConnectorCredentialPair", + back_populates="connector", + passive_deletes=True, + ) # synchronize this validation logic with RefreshFrequencySchema etc on front end # until we have a centralized validation schema @@ -757,7 +761,11 @@ class Credential(Base): ) documents_by_credential: Mapped[ list["DocumentByConnectorCredentialPair"] - ] = relationship("DocumentByConnectorCredentialPair", back_populates="credential") + ] = relationship( + "DocumentByConnectorCredentialPair", + back_populates="credential", + passive_deletes=True, + ) user: Mapped[User | None] = relationship("User", back_populates="credentials") @@ -1110,10 +1118,10 @@ class DocumentByConnectorCredentialPair(Base): id: Mapped[str] = mapped_column(ForeignKey("document.id"), primary_key=True) # TODO: transition this to use the ConnectorCredentialPair id directly connector_id: Mapped[int] = mapped_column( - ForeignKey("connector.id"), primary_key=True + ForeignKey("connector.id", ondelete="CASCADE"), primary_key=True ) credential_id: Mapped[int] = mapped_column( - ForeignKey("credential.id"), primary_key=True + ForeignKey("credential.id", ondelete="CASCADE"), primary_key=True ) # used to better keep track of document counts at a connector level @@ -1123,10 +1131,10 @@ class DocumentByConnectorCredentialPair(Base): has_been_indexed: Mapped[bool] = mapped_column(Boolean) connector: Mapped[Connector] = relationship( - "Connector", back_populates="documents_by_connector" + "Connector", back_populates="documents_by_connector", passive_deletes=True ) credential: Mapped[Credential] = relationship( - "Credential", back_populates="documents_by_credential" + "Credential", back_populates="documents_by_credential", passive_deletes=True ) __table_args__ = (