我可以将字典传递给 SQLAlchemy 中的 where() 吗?

Can I pass a dict to where() in SQLAlchemy?

而不是通过一组静态列选择行,例如

stmt = select(User).where(and_(User.first_name == 'foo', User.last_name == 'bar'))

我想传递一个包含可变列集的字典,例如

cols = {'User.first_name': 'foo', 
        'User.last_name': 'bar',
        'User.other_col': 'blah'}
stmt = select(User).where(cols)

这样的事情可能吗?

正如我在评论中所说,您可以在先定义语句后添加它。

我觉得 Flask 是一个很好的例子,您需要在其中基于输入构建查询。

@app.route('/users', methods=['GET'])
def users_get():
    """Get matching users."""
    stmt = select(User)

    if request.args.get('username'):
        stmt = stmt.where(User.username == request.args['username'])

    if request.args.get('parent'):
        stmt = stmt.where(User.parent.has(User.username == request.args['parent']))

    if request.args.get('children'):
        children = request.args['children'].split(',')
        stmt = stmt.where(User.children.any(User.username.in_(children)))

    matching_users = session.query(stmt).scalars()

    return map(user_to_dict, matching_user)

或者,如果您需要构建一个 OR 语句,只需构建一个列表并一次性添加:

stmt = select(User)

exprs = []
if a:
    exprs.append(User.username == a)
if b:
    exprs.append(User.username == b)
if where:
    stmt = stmt.where(or_(*exprs))

你说在执行之前你怎么不知道 table 结构,这取决于你如何获得列,如果你做了 getattrs,这样的事情也许会起作用?

stmt = select(User)

for k, v in get_column_values(User).items():
    stmt = stmt.where(getattr(User, k) == v)