【问题标题】:Is there a way to populate one table from multiple on SQLAlchemy有没有办法在 SQLAlchemy 上从多个表中填充一个表
【发布时间】:2021-02-10 14:51:14
【问题描述】:

我正在尝试使用 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的名字。

有没有办法做到这一点?

谢谢

【问题讨论】:

  • 您是在尝试一次性复制,还是在寻找view?这本质上是一个返回任何你喜欢的子查询的快捷方式。您也可以将其存储为表格 - 然后您可以添加索引和内容,但您必须手动更新视图。在这种情况下,视图被称为materialized
  • 我正在尝试一次性复制而不是视图,我认为可以使用 SQLAlchemy 自动复制。
  • 所以你想将AB的内容复制到C一次?是否有不想使用常规 SQL 的理由?
  • 是的,仅出于专业原因

标签: python database database-design sqlalchemy


【解决方案1】:

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

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

根据this answer,这使得等效的 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) 执行它,具体取决于您使用的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多