from django.db import connection
q = 'some value'
sql1 = 'SELECT * FROM table WHERE field LIKE %%%s%%' % q
sql2 = 'SELECT * FROM table WHERE field LIKE %%'+ q +'%%'
cursor = connection.cursor()
cursor.execute( sql1 ) #why exception: IndexError: tuple index out of range ?
cursor.execute( sql2 ) #works ok
質問する
1955 次
3 に答える
6
SQL引数を適切に引用する必要があります。
また、適切に引用するということは、文字列の前後に'を追加するのではなく、DBAPIが提供する引用機能を使用することを意味します。これは役に立ちません。
正しいコード:
q = "%"+q+"%"
cursor.execute( 'SELECT * FROM table WHERE field LIKE %s', (q,) )
本当に正しいコード:
q = "%"+q.replace("%","%%")+"%"
cursor.execute( 'SELECT * FROM table WHERE field LIKE %s', (q,) )
q = "a'bc"と仮定します。最初に、これを "%a'bc%"と書き直してから、通常の文字列引数として使用します。psycopgは、必要に応じて'%a \'bc%'として書き換えます。
qに「%」が含まれている可能性があり、それを検索する場合は、2番目のものを使用します。
于 2011-05-21T21:48:53.540 に答える
1
直接文字列操作を使用すると、SQLインジェクション攻撃に対して脆弱な不適切なSQLがほぼ確実に発生します(この件に関するpsycopg2のコメントを参照してください)。
あなたが探しているのは、djangoでLIKE'%some value%'を実行してみることですよね?:
from django.db import connection
q = '%some value%'
cur = connection.cursor()
cur.execute("SELECT * FROM table WHERE field LIKE %(my_like)s", {'my_like': q})
psycopg2 2.4.1の時点で、サーバーで実行されるSQLは次のとおりです。
SELECT * FROM table WHERE field LIKE '%some value%'
于 2011-05-22T15:29:47.193 に答える
0
SQLコマンドを適切に引用する必要があります。
sql1 = "SELECT * FROM table WHERE field LIKE '%%%s%%'" % q
sql2 = "SELECT * FROM table WHERE field LIKE '%"+ q +"%'"
そして、適切に引用するということは、式で一重引用符を使用することを意味しLIKE
ます。
于 2011-05-21T16:47:44.763 に答える