Параметризованный запрос PyMySQL и формат даты

Я пытаюсь выполнить следующий запрос с помощью PyMySQL

cur.execute("SELECT %s as label, UNIX_TIMESTAMP(CONVERT(DATE_FORMAT(date_added, '%%Y-%%m-%%d-%%H:%%i:00'),DATETIME)) as time, %s  as metric FROM %s WHERE id >= %d GROUP BY label, time", (label, metric, table, min_id,))

Я получаю следующую ошибку:

TypeError: %d format: a number is required, not str

label, metric, table и min_id - это строка, строка, строка и int соответственно.

Я неправильно убегаю от%? Не могу понять это, пробовал несколько вещей.

Спасибо!


person araspion    schedule 27.06.2013    source источник


Ответы (1)


... id >= %d ... должно быть ... id >= %s ....

Все параметры преобразуются в строки перед применением к строке формата.

person mata    schedule 27.06.2013
comment
Но .... но .... почему ????? Попробуйте select * from users limit %d; в качестве вашего запроса! - person Tom; 28.07.2015
comment
Нет, это не сработает, только если вы сделаете cur.execute('select * from users limit %d' % (10,)), который использует форматирование строки вместо параметров sql и потенциально опасно. - person mata; 28.07.2015
comment
Простите за незнание, но чем опасна вставка целого числа в SQL-запрос? Это не похоже на то, чтобы 10; drop table users; было целым числом. - person Tom; 28.07.2015
comment
Я не имел в виду, что использование целого числа опасно, но, как правило, использование форматирования строк для построения запросов sql опасно. В этом случае это не будет проблемой, но представьте, что позже вам нужно будет добавить какое-то предложение where со строковым параметром и не заметить, что вы использовали форматирование строки вместо параметризации sql. Внезапно у вас есть потенциальная уязвимость sql-инъекции ... - person mata; 28.07.2015