我可以将字典传递给 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)
而不是通过一组静态列选择行,例如
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)