如何在查询中进行字符串替换?

时间:2012-09-22 00:28:05

标签: python sqlalchemy pyramid

我正在尝试在金字塔中动态生成一些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'" 我怎么能这样做?

2 个答案:

答案 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注入攻击。