у меня данные преобразовались в value objects, для этого я в properties указываю у нужного поля composite(ValueObject, table.c.column), но при запросе он выдает исключение о конфликте
WARNING: when configuring property 'id' on Mapper[MedCard(med_cards)], column 'id' conflicts with property '<Composite at 0x7febf491a450; id>'. To resolve this, map the column to the class under a different name in the 'properties' dictionary. Or, to remove all awareness of the column entirely (including its availability as a foreign key), use the 'include_properties' or 'exclude_properties' mapper arguments to control specifically which table columns get mapped.
Указывал поле в include_properties, но все бестолку.
Код:
med_card = Table(
"med_cards",
metadata_obj,
Column("id", Integer, primary_key=True)
)
@dataclass(frozen=True)
class IDVO:
value: int
@dataclass
class MedCard:
id: IDVO
doctor_notes: List[DoctorNote]
mapper_registry = registry()
mapper_registry.map_imperatively(MedCard, med_card, properties={
"id": composite(IDVO, med_card.c.id),
"doctor_notes": relationship(DoctorNote),
})
Может есть иной способ без конфликтов поместить данные в value object при маппингк?
Ты хочешь, чтобы в атрибуте id вместо id из таблицы лежал инстанс датакласса?
Очень странно желание. Но тебе надо тогда переименовать то, на какой атрибут мапится столбец id. Я декларативном стиле это можно сделать, как это сделать в императивном, я не знаю
Так тебе надо написать свой тип, нет? Иначе у тебя алхимия всё равно не поймёт, когда нужно будет сравнивать/записывать в базу и т.п. Хотя вроде там появилось что-то вроде compare, но хз как это работает
почему бы просто не сделать свой маппер, который будет получать модель бд и создавать доменную модель сам?
Обсуждают сегодня