【问题标题】:How to autofill table with foreign keys in SQLAlchemy using relationships?如何使用关系在 SQLAlchemy 中使用外键自动填充表?
【发布时间】:2022-01-12 08:41:12
【问题描述】:

使用SQLAlchemy 我有三个模型:Parent1Parent2Child,其中 Parent1 有与 Parent2 一对一的关系,并且它们都与 Child 具有相同的关系。他们是这样的:

from extensions import db_session

class Parent1(Base):
    __tablename__ = 'parent1'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    
    parent2 = relationship("Parent2", backref="parent1", uselist=False)
    child = relationship("Child", backref="parent1", uselist=False)



class Parent2(Base):
    __tablename__ = 'parent2'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    parent1_id = Column(Integer, ForeignKey('parent1.id'))

    child = relationship("Child", backref="parent2", uselist=False)

class Child(Base):
    id = Column(Integer, primary_key=True)
    parent1_id = Column(Integer, ForeignKey('parent1.id'))
    parent2_id = Column(Integer, ForeignKey('parent2.id'))

我想要实现的是用其父母的外键填充 Child 表。 所以,当我执行这个时:

parent1 = Parent1(name="Adil")
parent1.parent2 = Parent2(name="Aisha")
parent1.child = Child()
db_session.add(parent1)
db_session.commit()

它根据需要向父表插入数据,但向 Child 表插入数据如下:

儿童

id  parent1_id  parent2_id
 1           1        NULL

如何正确设置关系,以便在对 Parent1->Parent2 表的任何插入时,它还将其 id 作为外键插入 Child强>表?

我想要实现的是:

儿童

id  parent1_id  parent2_id
 1           1           1

【问题讨论】:

    标签: python sql sqlalchemy orm flask-sqlalchemy


    【解决方案1】:

    我想出了这个solution。我删除了声明的模型 Child 并在两个模型之间创建了关联表,并添加了使用关联表名称填充的辅助参数:

    Base = declarative_base()
    
    child = Table('child', Base.metadata,
                   Column('parent1_id', Integer, ForeignKey('parent1.id')),
                   Column('parent2_id', Integer, ForeignKey('parent2.id')))
    
    
    class Parent1(Base):
        __tablename__ = 'parent1'
        id = Column(Integer, primary_key=True)
        name = Column(String, nullable=False)
    
        parent2 = relationship("Parent2", secondary='child', uselist=False)
    
    
    class Parent2(Base):
        __tablename__ = 'parent2'
        id = Column(Integer, primary_key=True)
        name = Column(String, nullable=False)
        parent1_id = Column(Integer, ForeignKey('parent1.id'))
    

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多