Остерегайтесь использования интерполяции строк для SQL-запросов, поскольку это не приведет к корректному экранированию входных параметров и оставит ваше приложение открытым для уязвимостей SQL-инъекций. Разница может показаться тривиальной, но на самом деле она огромна.
Некорректно (из-за проблем с безопасностью)
c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))
Корректно (с экранированием)
c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))
Путаницы добавляет тот факт, что модификаторы, используемые для привязки параметров в операторе SQL, различаются в разных реализациях DB API и что клиентская библиотека mysql использует printf синтаксис стиля вместо более общепринятого маркера '?' (используемого, например. python-sqlite).
Ответ 2
У вас есть несколько доступных вариантов. Вам нужно освоиться с итерацией строк в python. Поиск этого термина может быть более успешным в будущем, когда вы захотите узнать о подобных вещах.
Учитывая, что у вас, вероятно, уже есть все ваши данные в объекте или словаре, второй формат подойдет вам больше. Также неприятно считать появления "% s" в строке, когда вам приходится возвращаться и обновлять этот метод через год :)
Ответ 3
В связанных документах приведен следующий пример:
cursor.execute (""" UPDATE animal SET name = %s WHERE name = %s """, ("snake", "turtle")) print"Number of rows updated: %d" % cursor.rowcount
So you just need to adapt this to your own code - example:
(If SongLength is numeric, you may need to use %d instead of %s).
Ответ 4
Actually, even if your variable (SongLength) is numeric, you will still have to format it with %s in order to bind the parameter correctly. If you try to use %d, you will get an error. Here's a small excerpt from this link http://mysql-python.sourceforge.net/MySQLdb.html:
To perform a query, you first need a cursor, and then you can execute queries on it:
c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (max_price,))
In this example, max_price=5 Why, then, use %s in the string? Because MySQLdb will convert it to a SQL literal value, which is the string '5'. When it's finished, the query will actually say, "...WHERE price < 5".