4
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
4

3 回答 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 可能包含“%”并且您想搜索它,则使用第二个。

于 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 回答