Jim*_*ket 168 python sqlalchemy
我查看了文档,我似乎无法找到如何在SQLAlchemy中进行OR查询.我只是想做这个查询.
SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey')
Run Code Online (Sandbox Code Playgroud)
应该是这样的
addr = session.query(AddressBook).filter(City == "boston").filter(????)
Run Code Online (Sandbox Code Playgroud)
Thi*_*ter 294
SQLAlchemy的重载位运算符&
,|
并~
因此而不是与丑陋和难以阅读前缀语法or_()
和and_()
(像巴斯蒂安的答案),你可以使用这些运营商:
.filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey'))
Run Code Online (Sandbox Code Playgroud)
请注意,由于按位运算符的优先级,括号不是可选的.
所以你的整个查询看起来像这样:
addr = session.query(AddressBook) \
.filter(AddressBook.city == "boston") \
.filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey'))
Run Code Online (Sandbox Code Playgroud)
Bas*_*ard 290
从教程:
from sqlalchemy import or_
filter(or_(User.name == 'ed', User.name == 'wendy'))
Run Code Online (Sandbox Code Playgroud)
Wil*_*oes 32
对于 SQLAlchemy ORM 2.0, 和|
都or_
被接受。
from sqlalchemy.future import select
from sqlalchemy.sql import or_
query = select(User).where(or_(User.name == 'ed', User.name == 'wendy'))
print(query)
# also possible:
query = select(User).where((User.name == 'ed') | (User.name == 'wendy'))
print(query)
Run Code Online (Sandbox Code Playgroud)
Val*_*lar 29
OR_运算符在OR查询组件数量未知的情况下非常有用.
例如,假设我们正在创建一个包含很少可选过滤器的REST服务,如果任何过滤器返回true,则应返回记录.另一方面,如果请求中未定义参数,则不应更改我们的查询.没有or_ function我们必须做这样的事情:
query = Book.query
if filter.title and filter.author:
query = query.filter((Book.title.ilike(filter.title))|(Book.author.ilike(filter.author)))
else if filter.title:
query = query.filter(Book.title.ilike(filter.title))
else if filter.author:
query = query.filter(Book.author.ilike(filter.author))
Run Code Online (Sandbox Code Playgroud)
使用or_函数可以将其重写为:
query = Book.query
not_null_filters = []
if filter.title:
not_null_filters.append(Book.title.ilike(filter.title))
if filter.author:
not_null_filters.append(Book.author.ilike(filter.author))
if len(not_null_filters) > 0:
query = query.filter(or_(*not_null_filters))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
121722 次 |
最近记录: |