V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
blacklinux
V2EX  ›  Python

SqlAlchemy 中,一个 query 如何多次执行 filter 添加 or 条件?

  •  
  •   blacklinux · 2017-04-07 14:09:36 +08:00 · 5042 次点击
    这是一个创建于 2590 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于某些原因,无法在一个 filter 里执行添加所有的 or 条件

    所以有以下情况: 已经存在一个 query

    query = session.query(User).filter(or_(User.id == 2,User.id == 3))

    ↑上面这个 query 的代码无法修改

    此时 sql 语句为 SELECT * FROM USER WHERE id=2 or id =3;

    此时还需要添加一个条件 or_(User.id == 4,User.id == 5)

    如果这样做:

    query = query.filter(or_(User.id == 4,User.id == 5))

    则 sql 语句变为

    SELECT * FROM USER WHERE id=2 or id =3 AND (id=4 or id =5)

    我期望的结果是

    SELECT * FROM USER WHERE id=2 or id =3 OR id=4 or id =5

    请问要怎么办?

    4 条回复    2017-04-21 17:54:12 +08:00
    xyjtou
        1
    xyjtou  
       2017-04-07 14:40:45 +08:00 via Android
    .union 一下就可以。
    jjx
        2
    jjx  
       2017-04-07 14:49:42 +08:00   ❤️ 1
    c = [User.id == 2, User.id == 3]

    if xxx:
    c += [User.id == 4,User.id == 5]

    q = session.query(User).filter(or_(*c))
    siteshen
        3
    siteshen  
       2017-04-08 00:55:44 +08:00
    方案 1 (推荐):解决掉“某些原因”,采用楼上的答案;
    方案 2 (不推荐):如果没法解决“某些原因”,看 SQLAlchemy 源码,
    人肉提取需要重写的条件(如示例的 `or_(User.id == 2,User.id == 3)`),
    再重写该过滤条件 (修改 query._criterion )。
    blacklinux
        4
    blacklinux  
    OP
       2017-04-21 17:54:12 +08:00
    最后还是重写了整个搜索方法...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2484 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:09 · PVG 00:09 · LAX 09:09 · JFK 12:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.