Python sqlalchemy - сохранение множества объектов один против многих - PullRequest
0 голосов
/ 01 октября 2019

В моей БД у меня есть модель «один ко многим» (родитель против многих детей). Содержимое файлов:

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')

1 Ответ

0 голосов
/ 02 октября 2019

Решение в моем случае: я добавил следующую строку в метод init ребенка;self.parent_id = parent.id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...