Код: Выделить всё
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"),
)
Код: Выделить всё
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. необходим. При использовании этого метода у меня возникли проблемы с отсоединенными экземплярами.
Код: Выделить всё
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()
Здесь происходит то, что SQLAlchemy интерпретирует DeviceTestType связан с каждым DeviceTestResult как отдельные объекты с одним и тем же первичным ключом, что, очевидно, приводит к сбою ограничения уникальности. Это также отражено в коде: все объекты DeviceTestType имеют только один связанный DeviceTestResult (вместо ожидаемых трех).
Я пробовал:
- Использование session.merge
- Использование session.no_autoflush
- Создание вспомогательной функции, которая создает один объект DeviceTestType и устанавливает все DeviceTestResult так, чтобы они указывали на этот объект
Кто-нибудь знает, как решить эту проблему?
Я знаю, что мое решение динамического создание DeviceTestType может быть неуместным, поэтому я также буду признателен за отзывы по этому поводу.
Подробнее здесь: https://stackoverflow.com/questions/789 ... nt-failing