有没有办法在 SQLAlchemy 上从多个填充一个 table
Is there a way to populate one table from multiple on SQLAlchemy
我正在尝试使用 SQLAlchemy 构建数据库,我的问题是我有两个具有相同列名的 table,并试图从另外两个中填充第三个 table。下面有一个简单的图表来说明:
我通常在一个 table 上设置外键,在另一个上设置关系:
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)
你可以看到这个方法只能对两个table有效,因为我在tableC上的ForeignKey for the name指定了tableA的名字。
有办法吗?
谢谢
在 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)
执行它,具体取决于您使用的是什么。
我正在尝试使用 SQLAlchemy 构建数据库,我的问题是我有两个具有相同列名的 table,并试图从另外两个中填充第三个 table。下面有一个简单的图表来说明:
我通常在一个 table 上设置外键,在另一个上设置关系:
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)
你可以看到这个方法只能对两个table有效,因为我在tableC上的ForeignKey for the name指定了tableA的名字。
有办法吗?
谢谢
在 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)
执行它,具体取决于您使用的是什么。