diff --git a/backend/alembic/versions/76b60d407dfb_cc_pair_name_not_unique.py b/backend/alembic/versions/76b60d407dfb_cc_pair_name_not_unique.py new file mode 100644 index 000000000000..66cedad4abb6 --- /dev/null +++ b/backend/alembic/versions/76b60d407dfb_cc_pair_name_not_unique.py @@ -0,0 +1,32 @@ +"""CC-Pair Name not Unique + +Revision ID: 76b60d407dfb +Revises: b156fa702355 +Create Date: 2023-12-22 21:42:10.018804 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = "76b60d407dfb" +down_revision = "b156fa702355" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.execute("DELETE FROM connector_credential_pair WHERE name IS NULL") + op.drop_constraint( + "connector_credential_pair__name__key", + "connector_credential_pair", + type_="unique", + ) + op.alter_column( + "connector_credential_pair", "name", existing_type=sa.String(), nullable=False + ) + + +def downgrade() -> None: + # This wasn't really required by the code either, no good reason to make it unique again + pass diff --git a/backend/danswer/db/connector.py b/backend/danswer/db/connector.py index d07827c80abe..b13f6e7eca01 100644 --- a/backend/danswer/db/connector.py +++ b/backend/danswer/db/connector.py @@ -36,8 +36,12 @@ def fetch_connectors( return list(results.all()) -def connector_by_name_exists(connector_name: str, db_session: Session) -> bool: - stmt = select(Connector).where(Connector.name == connector_name) +def connector_by_name_source_exists( + connector_name: str, source: DocumentSource, db_session: Session +) -> bool: + stmt = select(Connector).where( + Connector.name == connector_name, Connector.source == source + ) result = db_session.execute(stmt) connector = result.scalar_one_or_none() return connector is not None @@ -67,7 +71,9 @@ def create_connector( connector_data: ConnectorBase, db_session: Session, ) -> ObjectCreationIdResponse: - if connector_by_name_exists(connector_data.name, db_session): + if connector_by_name_source_exists( + connector_data.name, connector_data.source, db_session + ): raise ValueError( "Connector by this name already exists, duplicate naming not allowed." ) @@ -95,8 +101,8 @@ def update_connector( if connector is None: return None - if connector_data.name != connector.name and connector_by_name_exists( - connector_data.name, db_session + if connector_data.name != connector.name and connector_by_name_source_exists( + connector_data.name, connector_data.source, db_session ): raise ValueError( "Connector by this name already exists, duplicate naming not allowed." diff --git a/backend/danswer/db/models.py b/backend/danswer/db/models.py index 0ed1b0ab2897..13a7a25285a1 100644 --- a/backend/danswer/db/models.py +++ b/backend/danswer/db/models.py @@ -173,9 +173,7 @@ class ConnectorCredentialPair(Base): unique=True, nullable=False, ) - name: Mapped[str] = mapped_column( - String, unique=True, nullable=True - ) # nullable for backwards compatability + name: Mapped[str] = mapped_column(String, nullable=False) connector_id: Mapped[int] = mapped_column( ForeignKey("connector.id"), primary_key=True )