psycopg2 странное поведение - PullRequest
4 голосов
/ 21 мая 2011
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 ]

6 голосов
/ 22 мая 2011

Вам нужно правильно ЗАКАЗАТЬ свои аргументы 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 голос
/ 22 мая 2011

Использование прямой строковой манипуляции почти наверняка приведет к неправильному SQL, который уязвим для атак SQL-инъекций ( см. Комментарии psycopg2 по этому вопросу ).

То, что вы ищетесделать, это попробовать и выполнить LIKE '% some value%' в django, верно?:

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%'
0 голосов
/ 21 мая 2011

Вам необходимо правильно ЗАКАЗАТЬ вашу SQL-команду:

sql1 = "SELECT * FROM table WHERE field LIKE '%%%s%%'" % q
sql2 = "SELECT * FROM table WHERE field LIKE '%"+ q +"%'"

И правильно заключить в кавычки Я имею в виду использование одинарных кавычек с LIKE выражениями.

...