Отношения «многие к одному» приводят к сбою ограничения UNIQUE.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Отношения «многие к одному» приводят к сбою ограничения UNIQUE.

Сообщение Anonymous »

У меня есть два объекта, DeviceTestResult и DeviceTestType, находящиеся в отношении многие к одному, то есть DeviceTestResult имеет один DeviceTestType и DeviceTestType имеет множество результатов DeviceTestResults.

Код: Выделить всё

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session

class DeviceTestType(Base):
Base = declarative_base()
__tablename__ = "device_test_type"
name: Mapped[str] = mapped_column(String(255))
test_results: Mapped[list["DeviceTestResult"]] = relationship(
back_populates="test_type"
)
idx: Mapped[str] = mapped_column(primary_key=True)

class DeviceTestResult(Base):
__tablename__ = "device_test"
count = 0
test_type: Mapped[DeviceTestType] = relationship(back_populates="test_results")
test_type_idx: Mapped[str] = mapped_column(
ForeignKey("device_test_type.idx"),
)
У меня есть класс DeviceTester, который генерирует DeviceTestResult. DeviceTestType здесь генерируется динамически — первичный ключ основан на идентификаторах продуктов устройств, названиях тестов и т. д. Этот класс предназначен для реализации пользователем, поэтому для разных устройств можно написать разные реализации тестов.

Код: Выделить всё

class DeviceTester:
def __init__(self):
self.test_type = DeviceTestType(idx='0006969') # primary key.idx is generated dynamically based on device parameters

def run_test(self):
result = DeviceTestResult(test_type=self.test_type)
return result
Причина, по которой я динамически генерирую тип теста (вместо того, чтобы внедрять его как зависимость от DeviceTester), заключается в том, что:
  • Новый тип теста можно добавить, просто создав новый класс (в отличие от необходимости сначала добавлять его в базу данных).
  • Нет запросов перед созданием DeviceTester. необходим. При использовании этого метода у меня возникли проблемы с отсоединенными экземплярами.
Проблема возникает, когда у вас несколько экземпляров DeviceTester:

Код: Выделить всё

test_1 = DeviceTester().run_test()
test_2 = DeviceTester().run_test()
test_3 = DeviceTester().run_test()

with Session() as session:
session.add_all([test_1, test_2, test_3])
session.commit()
Это приводит к ошибке IntegrityError — ограничение не выполнено: device_test_type.idx.
Здесь происходит то, что SQLAlchemy интерпретирует DeviceTestType связан с каждым DeviceTestResult как отдельные объекты с одним и тем же первичным ключом, что, очевидно, приводит к сбою ограничения уникальности. Это также отражено в коде: все объекты DeviceTestType имеют только один связанный DeviceTestResult (вместо ожидаемых трех).
Я пробовал:
  • Использование session.merge
  • Использование session.no_autoflush
  • Создание вспомогательной функции, которая создает один объект DeviceTestType и устанавливает все DeviceTestResult так, чтобы они указывали на этот объект
Похоже, ничего из этого не работает.
Кто-нибудь знает, как решить эту проблему?
Я знаю, что мое решение динамического создание DeviceTestType может быть неуместным, поэтому я также буду признателен за отзывы по этому поводу.

Подробнее здесь: https://stackoverflow.com/questions/789 ... nt-failing
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»