psycopg2奇怪的行为

时间:2011-05-21 16:43:32

标签: django postgresql psycopg

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

3 个答案:

答案 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表达式的单引号。