Добавьте строку, использующую цитату в необработанном запросе django

#python #django #mysql-python

Вопрос:

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

Но это дает мне ошибку, что он ожидает другого параметра.

   ModelName.objects.raw("select * from tablename where city='%s' and state=%s",params=['San francisco', 'Los Angeles'])
 

Это ошибка, которая возникает

  error:  Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.
 

Комментарии:

1. Почему вы используете '%s' ? Документация явно не рекомендует этого делать…

Ответ №1:

В разделе Передача параметров в raw() документация явно предупреждает о том, чтобы не ставить кавычки вокруг %s (т. Е. Писать это как '%s' ), а также заявляет, что это сделает вас уязвимыми для внедрения SQL. Двигаясь дальше, не должно иметь значения, что ваша строка содержит пробелы, %s они не используются для форматирования строк, скорее они позже заменяются ? Django и используются для выполнения запроса с использованием подготовленных операторов.

Следовательно, ваш запрос будет просто работать, если вы напишете:

 ModelName.objects.raw("select * from tablename where city=%s and state=%s",params=['San francisco', 'Los Angeles'])
 

Кроме того, для этого вам даже не нужны необработанные запросы. Вы можете просто написать что-то вроде следующего, что было бы эквивалентно:

 ModelName.objects.filter(city='San francisco', state='Los Angeles')
 

Комментарии:

1. Я исключаю кавычки, это не сработало, хотя и не показало никакой ошибки. Но запрос не дал никакого результата. Что мне делать?

2. @SMev Действительно ли в вашей таблице есть строка, в которой столбец state имеет значение "Los Angeles" ? И действительно ли в вашей таблице есть строка, в которой столбец city имеет значение "San francisco" с небольшим f? Если нет, это объяснило бы отсутствие результатов.

3.@SMev, как указано BoarGules, проверьте это. Также он может быть сохранен как San Francisco с большой буквы F в базе данных, в вашем запросе вы написали небольшой f .