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
答案 0 :(得分: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可能包含“%”并且您想要搜索它,那么请使用第二个。
答案 1 :(得分:1)
使用直接字符串操作几乎肯定会导致易受SQL注入攻击(see psycopg2's comments on the subject)的SQL不正确。
我认为你要做的是尝试在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%'
答案 2 :(得分:0)
您需要正确引用SQL命令:
sql1 = "SELECT * FROM table WHERE field LIKE '%%%s%%'" % q
sql2 = "SELECT * FROM table WHERE field LIKE '%"+ q +"%'"
通过正确引用,我的意思是使用带有LIKE
表达式的单引号。