gpt4 book ai didi

sqlalchemy:如何在 sqlalchemy 中执行这个简单的子查询?

转载 作者:行者123 更新时间:2023-12-04 05:38:58 28 4
gpt4 key购买 nike

两种型号:

class this(DeclarativeBase):

__tablename__ = 'this'

'Columns'
id = Column(Integer, primary_key=True)

'Relations'
that = relation('that', foreign_keys=id, backref='this')

class that(DeclarativeBase):

__tablename__ = 'that'

'Columns'
id = Column(Integer, primary_key=True)
this_id = Column(Integer, ForeignKey('this.id'))

我想运行这个简单的 SQL 查询:
SELECT id, (SELECT COUNT(*) FROM that WHERE this_id = this1.id) AS thatcount FROM this AS this1

我可以通过执行以下操作在 sqlalchemy 中获得相同的结果:
results = session.query(model.this.id, 
func.count(model.that.id).label('thatcount')) \
.join(model.that) \
.group_by(model.this.id)

但是,由此产生的 SQL 不是我想要的:
SELECT
this.id AS this_id,
count(that.id) AS thatcount
FROM this
INNER JOIN that ON this.id = that.this_id
GROUP BY this.id

我在 sqlalchemy 中缺少一些基本的想法......

1) 如何在 FROM 子句中“标记”表?
2) 如何创建引用父查询结果的子查询?

希望这是我不明白的简单事情,因为我对 sqlalchemy 比较陌生......当然我可以只运行原始 SQL,但我对 sqlalchemy 印象深刻,我相信这是可能的。

任何帮助将不胜感激!

最佳答案

qry = select([
this.id,
select([func.count().label('xx')], this.id == that.this_id).as_scalar().label('thatcount'),
])

产生:
SELECT this.id, (SELECT count(*) AS xx
FROM that
WHERE this.id = that.this_id) AS thatcount
FROM this

直接回答您的问题:
  • 使用 label()
  • 你不需要那个,你只需使用 whereclauseselect指示主查询和子查询之间的连接条件。

  • 请注意,我更喜欢 func.count(that.id)func.count()不过,因为它更明确。

    关于sqlalchemy:如何在 sqlalchemy 中执行这个简单的子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11530282/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com