2015-02-13 6 views
0

Я использую MySQLDB для запроса некоторых данных из базы данных, при использовании, как в sql, я смущен о sql-предложении.python mysqldb query with where

Как я использую, так что я построю ниже sql, который может получить правильный результат.

cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%"+"ccc"+"%",)) 

Теперь я хочу сделать столбец b переменной как указано ниже. он не получит ни одного

cur.execute("SELECT a FROM table WHERE %s like %s limit 0,10", ("b", "%"+"ccc"+"%")) 

Я искал много сайтов, но не получил результат. Я немного головокружение.

ответ

0

Причина, по которой второй запрос не работает в том, что запрос, который является результатом подстановки в параметризируются запрос выглядит следующим образом:

select a from table where 'b' like '%ccc%' limit 0,10 

'b' не относится к таблице, но к статической строке 'b'. Если вместо этого вы прошли строку abcccba в запрос вы получите запрос, который выбирает все строки:

cur.execute("SELECT a FROM table WHERE %s like %s limit 0,10", ("abcccba", "%"+"ccc"+"%")) 

генерирует запрос:

SELECT a FROM table WHERE 'abcccba' like '%ccc%' limit 0,10 

Из этого теперь вы должны быть в состоянии понять, почему второй query возвращает пустой набор результатов: строка b не похожа на %ccc%, поэтому никакие строки не будут возвращены.

Поэтому вы не можете установить значения для таблиц и столбцов, используя параметризованные запросы, вы должны использовать обычные строки Python subtitution:

cur.execute("SELECT a FROM table WHERE {} like %s limit 0,10".format('b'), ("abcccba", "%"+"ccc"+"%")) 

, который будет генерировать и выполнить запрос:

SELECT a FROM table WHERE b like '%ccc%' limit 0,10 
0

Вы, вероятно, нужно переписать переменные подстановки из

cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%"+"ccc"+"%")) 

к

cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%"+"ccc"+"%",)) 

Примечания трейлинг запятой, которая добавляет последний пустой элемент, который убеждается кортеж, который утверждает переменный длиннее 1 элемент. В этом примере конкатенация даже нет необходимости, этот код говорит:

cur.execute("SELECT a FROM table WHERE b like %s limit 0,10", ("%ccc%",)) 
+0

Спасибо за На самом деле, у меня есть опечатка в посте, я ее обновлю. это не связано с запятой. –

1

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

column = 'b' 
query = "SELECT a FROM table WHERE {} like %s limit 0,10".format(column) 
cur.execute(query, ("%"+"ccc"+"%",)) 

Вы могли бы сделать это немного лучше, используя format в параметрах тоже:

cur.execute(query, ("%{}%".format("ccc",))