gpt4 book ai didi

python - sqlalchemy 分页

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:08 25 4
gpt4 key购买 nike

我正在使用 flask 和 sqlalchemy 构建一个 REST 应用程序,我遇到了一个问题。我想查询所有用户的图书数量。每个用户都有很多书,所以我的查询应该返回每个用户在结果集中拥有的书数。

//      Models
class User( object ):
__tablename__ = 'user'

class Book( object ):
__tablename__ = 'book'

// Metadata
users_table = Table( 'user', metadata,
Column( 'id', Integer, primary_key = True ),
Column( 'username', String( 50 ), unique = True )
)

books_table = Table( 'book', metadata,
Column( 'id', Integer, primary_key = True ),
Column( 'title', String( 50 ) ),
Column( 'user_id', Integer, ForeignKey( 'user.id' ) )
)

// Mappers
mapper( User, users_table, properties = {
'booksCount': column_property(
select(
[func.count( books_table.c.id )],
books_table.c.user_id == users_table.c.id
).label( 'booksCount' )
),
'books' : relationship( Book )
} )

mapper( Book, books_table, properties = {
'user': relationship( User )
} )

如果我想查询所有用户,它工作正常并带回关联“booksCount”的结果,但如果我想更深入,假设只查询“booksCount”大于 4 的用户,那就变得复杂了因为我还需要在应用限制/偏移量之前知道总结果数,以便我的分页工作。

//  this works
rows = User.query
totalRows = rows.count ()
users = rows.limit( 50 ).offset( 0 ).all()

for user in users:
...

// this throws an error
rows = User.query.having('booksCount>4')
totalRows = rows.count ()
users = rows.limit( 50 ).offset( 0 ).all()

第二个示例失败的原因是因为 totalRows = rows.count () 创建了第二个查询来计算第一个结果:SELECT count(1) AS count_1 FROM user 但是当 having 插入到查询中时,它会更改为 SELECT count(1) AS count_1 FROM user having booksCount>4 这显然会引发错误,因为 booksCount 是从未在第二个查询中选择。

那么,如何在应用了 having 子句的情况下提取总行数呢?

谢谢。

最佳答案

这其实是一个sql语法错误。 having 子句仅在包含 group by 子句且仅过滤聚合结果时使用。您需要的是一个简单的 where 子句:

rows = User.query.filter(User.booksCount > 4)

作为旁注:请按照 python 标准编写代码,例如User.books_count

关于python - sqlalchemy 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6282534/

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