Вопрос-Ответ

MySQL parameterized queries

Параметризованные запросы MySQL

Мне сложно использовать модуль MySQLdb для вставки информации в мою базу данных. Мне нужно вставить 6 переменных в таблицу.

cursor.execute ("""
INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
VALUES
(var1, var2, var3, var4, var5, var6)

"""
)

Кто-нибудь может помочь мне с синтаксисом здесь?

Переведено автоматически
Ответ 1

Остерегайтесь использования интерполяции строк для 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. Поиск этого термина может быть более успешным в будущем, когда вы захотите узнать о подобных вещах.

Лучше для запросов:

some_dictionary_with_the_data = {
'name': 'awesome song',
'artist': 'some band',
etc...
}
cursor.execute ("""
INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
VALUES
(%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s, %(location)s)

"""
, some_dictionary_with_the_data)

Учитывая, что у вас, вероятно, уже есть все ваши данные в объекте или словаре, второй формат подойдет вам больше. Также неприятно считать появления "% 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:

cursor.execute ("""
INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
VALUES
(%s, %s, %s, %s, %s, %s)

"""
, (var1, var2, var3, var4, var5, var6))

(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".

2023-04-25 09:11 python