В моей БД у меня есть модель «один ко многим» (родитель против многих детей). Содержимое файлов:
class Parent(Base):
__tablename__ = 'parent'
id = Column('id', bigint, primary_key=True)
name = Column('name', TEXT, nullable=False)
lname = Column('lname', TEXT, nullable=False)
register_date = Column('register_date',DateTime(timezone=True), default=datetime.datetime.utcnow)
children = relationship('Child')
def __init__(self, id, name,lname,register_date):
self.id=id
self.name=name
self.lname=lname
class Child(Base):
__tablename__ = 'children'
id = Column('id', bigint, primary_key=True)
parent_id = Column('parents', ForeignKey('parents.id'), nullable=False)
name = Column('name', TEXT, nullable=False)
lname = Column('lname', TEXT, nullable=False)
register_date = Column('register_date',DateTime(timezone=True),
parent = relationship('Parent', back_populates="children")
def __init__(self, id, name, lname, parent):
self.id=id
self.name=name
self.lname=lname
self.parent=parent
Мой ввод программы представляет собой файл XML в следующем формате:
<Parent>
<name> fname_example </name>
<lname> lname_example </lname>
<id> id_example </id>
<Children>
<Child>
<name> fname_example </name>
<lname> lname_example </lname>
<id> id_example </id>
</Child>
<Child>
<name> fname_example </name>
<lname> lname_example </lname>
<id> id_example </id>
</Child>
</Children>
</Parent>
<Parent>
....
</Parent>
После анализа этого файла XML у меня есть список родителей и детей,Сначала я сохраняю родителей:
session.add_all(parents)
И после нескольких проверок я также спасаю детей:
session.bulk_save_objects(children)
Моя проблема в том, что таким образом картографне сопоставляет родительский элемент дочерним элементам, и в запросе вставки я вижу, что null отображается как родительский:
sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush.
To begin a new transaction with this Session, first issue Session.rollback().
Original exception was: (psycopg2.errors.NotNullViolation) null value in column "parent" violates not-null constraint
DETAIL: Failing row contains (1, null, 'Roger', 'Prince','01-10-2019')