2

私は基本的に、回答者がここで指摘したことを達成しようとしています: psycopg2 cursor.execute() with SQL query parameter cause syntax error

私の声明は次のとおりです。

    cursor.execute('SELECT %s FROM %s WHERE %s = %s' % (pkey,table,field, "%s"), (value))

しかし、実行するとエラーが発生します:

---> 89         cur.execute('SELECT %s FROM %s WHERE %s = %s' % (pkey,table,field, "%s"), (value))
     90         res=cur.fetchone()
     91         if res==None:

TypeError: not all arguments converted during string formatting
4

2 に答える 2

4

あなたの問題は引用符ではなく、Python のタプル構文にありました。

すでに上でコメントしたように、1要素のタプルを表す正しい方法は(value,). 一般に、タプルの構文は (非公式に) 次のとおりです。

()
(value,)
(value, value)
(value, value, value)

多要素タプルについても同様です。

受け入れられた答えは実際には正しくなく、そこで提案されている変更は純粋に好みの問題です (最後の '%s' を置換後に追加するか、試行したか)。


これを覚えておいてください: Python で一般的な文字列置換を行うとき、文字列が 1 つだけの%s場合、タプルを削除して単一の置換文字列自体を渡すことができます:

'foo %s' % 'bar'

これにより、 が発生しfoo barます。

psycopg'scursor.executeで同じことを試すことができます。おそらく動作します (投稿する前に自分でテストしますが、できません)。

于 2012-04-08T22:45:08.613 に答える
4

次のことを試してください。db モジュールは適切な引用を処理する必要があります。

sql = 'SELECT %s FROM %s WHERE %s' % (pkey, table, field) + ' = %s'
cursor.execute(sql, (value, ))
于 2012-04-08T05:50:36.577 に答える