LINUX.ORG.RU

SQLAlchemy. Добавить запись, ссылающуюся на две родительские

 , ,


0

1

Пытаюсь вставить запись, ссылающуюся на две родительские:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import relationship

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy import ForeignKey

Base = declarative_base()
engine = create_engine('sqlite://')
Session = sessionmaker(engine)


class Parent(Base):
    __tablename__ = 'Parent'

    link = Column('link', Integer, primary_key=True, autoincrement=True)
    name = Column('c_name', String)

    child = relationship('Child')


class Parent2(Base):

    __tablename__ = 'Parent2'

    link = Column('link', Integer, primary_key=True, autoincrement=True)
    name = Column('c_name', String)

    child = relationship('Child')


class Child(Base):
    __tablename__ = 'Child'

    link = Column('link', Integer, primary_key=True, autoincrement=True)
    parent = Column('f_parent', Integer, ForeignKey('Parent.link'), nullable=False)
    parent2 = Column('f_parent2', Integer, ForeignKey('Parent2.link'), nullable=False)
    name = Column('c_name', String)


Base.metadata.create_all(engine)
session = Session()


parent = Parent(name='qwe')
parent2 = Parent2(name='qwerty')

session.add(parent)
session.add(parent2)
session.commit()

child = Child(name='child')

parent.child.append(child)
parent2.child.append(child)

session.add_all([parent, parent2])

session.commit()

Получаю ошибку:

(sqlite3.IntegrityError) NOT NULL constraint failed: Child.f_parent2 [SQL: INSERT INTO «Child» (f_parent, f_parent2, c_name) VALUES (?, ?, ?)] [parameters: (1, None, 'child')]

Как правильно вставить такую запись?



Последнее исправление: alexg (всего исправлений: 2)

Очевидно, что ты можешь сразу полностью инициализировать Child, почему ты этого не делаешь и чего пытаешься этим добиться?

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Да никакого сакрального смысла нет, просто хочу запись вставить.

Изначально пытался так сделать:

child = Child(name='child',
              parent=parent,
              parent2=parent2)

session.add(child)

Получил:

sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type. [SQL: INSERT INTO «Child» (f_parent, f_parent2, c_name) VALUES (?, ?, ?)] [parameters: (<__main__.Parent object at 0x7f115e17df60>, <__main__.Parent2 object at 0x7f115e17dd68>, 'child')]

В документации (https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html#association-ob...) нашел такой пример:

p1 = Parent()
c1 = Child()
p1.children.append(c1)

С таблицами у которых есть связь только с одной родительской таблицей все работает, с двумя нет.

alexg
() автор топика
Ответ на: комментарий от alexg

Да, забыл уточнить, что единственное требование у меня - сохранить и родительские и дочерние записи в одной транзакции.

alexg
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.