推荐学习书目
› 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 · Apr 7, 2017 · 5818 views
    This topic created in 3469 days ago, the information mentioned may be changed or developed.

    由于某些原因,无法在一个 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 replies  •  2017-04-21 17:54:12 +08:00
    xyjtou
        1
    xyjtou  
       Apr 7, 2017 via Android
    .union 一下就可以。
    jjx
        2
    jjx  
       Apr 7, 2017   ❤️ 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  
       Apr 8, 2017
    方案 1 (推荐):解决掉“某些原因”,采用楼上的答案;
    方案 2 (不推荐):如果没法解决“某些原因”,看 SQLAlchemy 源码,
    人肉提取需要重写的条件(如示例的 `or_(User.id == 2,User.id == 3)`),
    再重写该过滤条件 (修改 query._criterion )。
    blacklinux
        4
    blacklinux  
    OP
       Apr 21, 2017
    最后还是重写了整个搜索方法...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   745 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 20:21 · PVG 04:21 · LAX 13:21 · JFK 16:21
    ♥ Do have faith in what you're doing.