首页 > 解决方案 > 有没有办法在 SQLAlchemy 上从多个表中填充一个表

问题描述

我正在尝试使用 SQLAlchemy 构建数据库,我的问题是我有两个具有相同列名的表,并试图从另外两个表中填充第三个表。下面有一个简单的图表来说明:

这是图片

我通常在一张表上设置外键,在另一张表上设置关系:

class TableA(Base):
    __tablename__ = "tableA"
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    age = Column(Integer)
    name_relation = relationship("TableC", backref='owner')

class TableC(Base):
    __tablename__ = "tableC"
    id = Column(Integer, primary_key=True)
    name = Column(String(100), ForeignKey('tableA.name'))
    age = Column(Integer)

可以看到这个方法只能对两个表起作用,因为我在tableC上的ForeignKey为name指定了tableA的名字。

有没有办法做到这一点 ?

谢谢

标签: pythondatabasedatabase-designsqlalchemy

解决方案


在 SQL 中,您要查找的查询是

INSERT INTO C (id, name, age) (
  SELECT *
  FROM A
  UNION ALL
  SELECT *
  FROM B
)

根据这个答案,这使得等效的 SQLAlchemy

session = Session()
query = session.query(TableA).union_all(session.query(TableB))
stmt = TableC.insert().from_select(['id', 'name', 'age'], query)

或等效地

stmt = TableC.insert().from_select(
  ['id', 'name', 'age'],
  TableA.select().union_all(TableB.select())
)

之后,您可以使用connection.execute(stmt)或执行它session.execute(stmt),具体取决于您使用的内容。


推荐阅读