python – sqlalchemy分页
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – sqlalchemy分页,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1883字,纯文字阅读大概需要3分钟。
内容图文
我正在构建一个带有烧瓶和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但是当插入到查询中时它将更改为SELECT count (1)AS count_1来自拥有booksCount> 4的用户,因为在第二个查询中从未选择booksCount,因此显示错误.
那么如何在应用了having子句的select中提取总行数呢?
谢谢.
解决方法:
这实际上是一个sql语法错误. having子句仅在包含group by子句时使用,并且仅过滤聚合结果.你需要的是一个简单的where子句:
rows = User.query.filter(User.booksCount > 4)
作为旁注:请按照python标准执行您的代码,例如: User.books_count
内容总结
以上是互联网集市为您收集整理的python – sqlalchemy分页全部内容,希望文章能够帮你解决python – sqlalchemy分页所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。