SQLAlchemy: декларативная карта «многие ко многим» для родителя с двумя первичными ключами ⇐ Python
-
Гость
SQLAlchemy: декларативная карта «многие ко многим» для родителя с двумя первичными ключами
Я пытаюсь объявить связь многие-ко-многим с помощью SQLAlchemy, где мой родительский RowHeader может создавать дочерних экономистов через таблицу отношений. Я продолжаю сталкиваться с ошибками, связанными с несколькими путями соединения, отсутствием объявленных внешних ключей. У меня также есть ситуации, когда создание дочерних элементов нарушает ограничения первичного ключа. Мне нужен только один ребенок, но чтобы он был связан со многими родителями.
row_econ_table = Таблица( "row_econ_table", База.метаданные, Column("rh_f_index", ForeignKey("row_header.f_index"), Primary_key=True), #left Column("rh_row", ForeignKey("row_header.row"), Primary_key=True), # left Column("econ_un_id", ForeignKey("economist.un_name_id"), Primary_key=True), #right ) класс RowHeader(Base): __tablename__ = "заголовок_строки" f_index: Mapped[str] = Mapped_column(primary_key=True) строка: Mapped[int] = Mapped_column(primary_key=True) Имена: Mapped[str] = mapped_column() Организация: Mapped[str] = mapped_column(nullable=True) экономисты: Mapped[Список["Экономист"]] = взаимосвязь( #cascade="все, удалить", вторичный = row_econ_table, Foreign_keys=[f_index, строка], Primaryjoin="and_(RowHeader.f_index==row_econ_table.c.rh_f_index, " "RowHeader.row==row_econ_table.c.rh_row)", Secondaryjoin="Economist.un_name_id==row_econ_table.c.econ_un_id" ) def __repr__(self) -> str: return f"RowHeader(f_index={self.f_index!r}, row={self.row!r}, Names={self.Names!r}, Organization={self.Organization!r})" класс Экономист(База): __tablename__ = "экономист" un_name_id: Mapped[str] = Mapped_column(primary_key=True) Моя проблема заключается в том, что у меня есть два первичных ключа в родительском элементе, которые создают несколько путей объединения. Мне нужно два первичных ключа, чтобы сделать эту таблицу уникальной.
Моя цель состоит в том, чтобы: Родитель (RowHeader) создает всех дочерних элементов (Economist) через таблицу отношений. Если он не существует, создайте его. Если он существует, просто установите связь с ним через таблицу отношений. Но не создавайте несколько одинаковых дочерних элементов.
Я не уверен, что смогу сосчитать, сколько конфигураций я пробовал!
Я получил следующие ошибки:
sqlalchemy.exc.ArgumentError: не удалось найти какие-либо соответствующие столбцы внешнего ключа для условия вторичного соединения «economist.un_name_id = row_econ_table.econ_un_id» в отношении RowHeader.economists. Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint или помечены в условии соединения аннотацией Foreign(). sqlalchemy.exc.NoForeignKeysError: не удалось определить условие соединения между родительскими и дочерними таблицами в отношениях RowHeader.economists — внешние ключи, связывающие эти таблицы через вторичную таблицу row_econ_table, отсутствуют. Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint, или укажите выражения «primaryjoin» и «вторичное соединение». Кроме того, я получил это для создания таблиц один раз (потерял, какая комбинация создала это), но когда родительский элемент попытался создать новый дочерний элемент, который уже существует, я получил ошибку ограничения первичного ключа от дочернего элемента.
>
Обновление: удаление аргумента Foreign_keys приводит к успешному созданию таблиц. Итак, прогресс!
Но когда я пытаюсь добавить объекты в сеанс, что приводит к созданию строки в уже существующей таблице «экономист», я получаю ошибку ограничения уникальности и откат.
sqlite3.IntegrityError: Ошибка ограничения UNIQUE: экономист.un_name_id Думаю, я думал, что сеанс справился с этим за меня, но, может быть, так и было бы, если бы я не добавлял add_all, а добавлял их только по одному? Я использую SQLLITE в качестве бэкэнда. Не знаю, как осуществить объединение или сделать так, чтобы моя таблица "row_header" была связана только с существующим "экономистом"
Я пытаюсь объявить связь многие-ко-многим с помощью SQLAlchemy, где мой родительский RowHeader может создавать дочерних экономистов через таблицу отношений. Я продолжаю сталкиваться с ошибками, связанными с несколькими путями соединения, отсутствием объявленных внешних ключей. У меня также есть ситуации, когда создание дочерних элементов нарушает ограничения первичного ключа. Мне нужен только один ребенок, но чтобы он был связан со многими родителями.
row_econ_table = Таблица( "row_econ_table", База.метаданные, Column("rh_f_index", ForeignKey("row_header.f_index"), Primary_key=True), #left Column("rh_row", ForeignKey("row_header.row"), Primary_key=True), # left Column("econ_un_id", ForeignKey("economist.un_name_id"), Primary_key=True), #right ) класс RowHeader(Base): __tablename__ = "заголовок_строки" f_index: Mapped[str] = Mapped_column(primary_key=True) строка: Mapped[int] = Mapped_column(primary_key=True) Имена: Mapped[str] = mapped_column() Организация: Mapped[str] = mapped_column(nullable=True) экономисты: Mapped[Список["Экономист"]] = взаимосвязь( #cascade="все, удалить", вторичный = row_econ_table, Foreign_keys=[f_index, строка], Primaryjoin="and_(RowHeader.f_index==row_econ_table.c.rh_f_index, " "RowHeader.row==row_econ_table.c.rh_row)", Secondaryjoin="Economist.un_name_id==row_econ_table.c.econ_un_id" ) def __repr__(self) -> str: return f"RowHeader(f_index={self.f_index!r}, row={self.row!r}, Names={self.Names!r}, Organization={self.Organization!r})" класс Экономист(База): __tablename__ = "экономист" un_name_id: Mapped[str] = Mapped_column(primary_key=True) Моя проблема заключается в том, что у меня есть два первичных ключа в родительском элементе, которые создают несколько путей объединения. Мне нужно два первичных ключа, чтобы сделать эту таблицу уникальной.
Моя цель состоит в том, чтобы: Родитель (RowHeader) создает всех дочерних элементов (Economist) через таблицу отношений. Если он не существует, создайте его. Если он существует, просто установите связь с ним через таблицу отношений. Но не создавайте несколько одинаковых дочерних элементов.
Я не уверен, что смогу сосчитать, сколько конфигураций я пробовал!
Я получил следующие ошибки:
sqlalchemy.exc.ArgumentError: не удалось найти какие-либо соответствующие столбцы внешнего ключа для условия вторичного соединения «economist.un_name_id = row_econ_table.econ_un_id» в отношении RowHeader.economists. Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint или помечены в условии соединения аннотацией Foreign(). sqlalchemy.exc.NoForeignKeysError: не удалось определить условие соединения между родительскими и дочерними таблицами в отношениях RowHeader.economists — внешние ключи, связывающие эти таблицы через вторичную таблицу row_econ_table, отсутствуют. Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint, или укажите выражения «primaryjoin» и «вторичное соединение». Кроме того, я получил это для создания таблиц один раз (потерял, какая комбинация создала это), но когда родительский элемент попытался создать новый дочерний элемент, который уже существует, я получил ошибку ограничения первичного ключа от дочернего элемента.
>
Обновление: удаление аргумента Foreign_keys приводит к успешному созданию таблиц. Итак, прогресс!
Но когда я пытаюсь добавить объекты в сеанс, что приводит к созданию строки в уже существующей таблице «экономист», я получаю ошибку ограничения уникальности и откат.
sqlite3.IntegrityError: Ошибка ограничения UNIQUE: экономист.un_name_id Думаю, я думал, что сеанс справился с этим за меня, но, может быть, так и было бы, если бы я не добавлял add_all, а добавлял их только по одному? Я использую SQLLITE в качестве бэкэнда. Не знаю, как осуществить объединение или сделать так, чтобы моя таблица "row_header" была связана только с существующим "экономистом"
Мобильная версия