sqlalchemy 合并 query 实现

2017-03-10 07:38:46 +08:00
 lbfeng
q_1 = Table.query.filter(Table.status==True, or_(Table.user_id == user_2.id, Table.size>10))
q_2 = Table.query.filter(Table.date > date, or_(Table.user_id == user_1.id, Table.size<8))

两个不同的 query 返回的是满足不同条件的样的 table objects ,能不能合并成一个 query ,可能加 pagination 。 试了 union 和 or_都不行。

4354 次点击
所在节点    Flask
7 条回复
xyjtou
2017-03-10 08:45:42 +08:00
方法 1 :如果是同一个 table ,需要用 alias 。

方法 2 :分多次把符合条件的 table.id 做成一个 list ,再 filter in list 一次。
mxi1
2017-03-10 09:00:25 +08:00
好久不用了,不过印象里 sqlalchemy 有专门的介绍。刚查了一下,可以用在 filter 里面使用 or_。 像这种: filter(or_(User.name=='Ed', User.name=='Tom'))
mxi1
2017-03-10 09:02:58 +08:00
抱歉,问题没看全。关于 Table 对象的操作没有做过。😓
lbfeng
2017-03-27 11:32:28 +08:00
@xyjtou 之前采用了方法 2 。最近这个问题又出现了。感觉方法二不够好。
```
query_1 = T1.query.filter(T1.attr_1 == value1, T1.attr_2 == T2.attr, T2.attr == value_2)
query_2 = T1.query.filter(T1.attr_1 == value3, T1.attr_3 == T4.attr, T3.attr == value_4)
```

```
T1.query.filter(_or((T1.attr_1 == value1, T1.attr_2 == T2.attr, T2.attr == value_2),
(T1.attr_1 == value3, T1.attr_3 == T4.attr, T3.attr == value_4))
```
这样又会出错。
lbfeng
2017-03-27 11:47:36 +08:00
好吧,我想多了。 query_1.union(query_2)就可以。
MrBetterman
2017-04-02 14:54:16 +08:00
我想问一下 sqlalchemy 中怎么加占位符
orm.Rent.query.filter(orm.Rent.title.like('%%s%',q)).all()
MrBetterman
2017-04-02 14:54:50 +08:00
我想问一下 sqlalchemy 中怎么加占位符
orm.Rent.query.filter(orm.Rent.title.like('%%s%',q)).all() 其中 q 是变量,不知道为什么就一直中断

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/346312

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX