0

我正在尝试在 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'" 我该怎么做?

4

2 回答 2

1

在上述情况下,您传入的字符串似乎不在正确的位置,而是试图将字符串传递给来自DBSession.query(). 尝试这个:

if len(queries) > 1:
  query = DBSession.query(Table).filter(and_('%s' % qq))
else:
  query = DBSession.query(Table).filter('%s' % qq)
于 2012-09-22T00:53:11.083 回答
0

这一行:

DBSession.query(Table).filter(and_('%s')) % qq

将 应用于% qq整个结果filter- 您只想将其应用于作为参数传入的字符串:

DBSession.query(Table).filter(and_('%s' % qq))

但是这里没有理由使用格式 - 只需直接传递字符串:

DBSession.query(Table).filter(and_(qq))

请注意,如果包含从用户输入生成的任何内容,使用 Python 的字符串格式并不能避免潜在的 sql 注入攻击。qq

于 2012-09-22T00:53:37.470 回答