我正在尝试在金字塔中动态生成一些sqlalchemy查询。
queries=[]
if var1=='1':
queries.append("Table.name.in_(['Dave'])")
if var2=='2':
queries.append("Table.last_name.in_(['Thomas'])")
qq = (','.join(queries))
if len(queries) > 1:
query = DBSession.query(Table).filter(and_('%s')) % qq
else:
query = DBSession.query(Table).filter('%s') % qq
我收到错误:"TypeError: unsupported operand type(s) for %: 'Query' and 'str'"
我怎么能这样做?
答案 0 :(得分:1)
在上面的例子中,看起来你传入的字符串不在正确的位置,而是试图将字符串传递给来自DBSession.query()
的Query对象。试试这个:
if len(queries) > 1:
query = DBSession.query(Table).filter(and_('%s' % qq))
else:
query = DBSession.query(Table).filter('%s' % qq)
答案 1 :(得分:0)
这一行:
DBSession.query(Table).filter(and_('%s')) % qq
将% qq
应用于filter
的整个结果 - 您只想将它应用于作为参数传入的字符串:
DBSession.query(Table).filter(and_('%s' % qq))
但是没有理由在这里使用格式化 - 只需直接传递字符串:
DBSession.query(Table).filter(and_(qq))
请注意,如果qq
包含从用户输入生成的任何内容,则使用Python的字符串格式设置 not 可以避免潜在的SQL注入攻击。