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

上記の場合、渡した文字列が適切な位置になく、代わりにからのQueryオブジェクトに文字列を渡そうとしているよう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 に答える