Мне сложно использовать модуль MySQLdb для вставки информации в мою базу данных. Мне нужно вставить в таблицу 6 переменных.
cursor.execute ("""
INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation)
VALUES
(var1, var2, var3, var4, var5, var6)
""")
Может ли кто-нибудь помочь мне с синтаксисом здесь?
python
mysql
bind-variables
Specto
источник
источник
printf
стиля%s
, и я был в некотором роде напуган тем, что писал уязвимые запросы. Спасибо, что сняли беспокойство! :)c.execute("SELECT * FROM foo WHERE bar = %s", (param1,))
У вас есть несколько вариантов. Вы захотите освоиться с итерацией строк в 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" в строке, когда вам нужно вернуться и обновить этот метод через год :)
источник
В связанных документах приводится следующий пример:
cursor.execute (""" UPDATE animal SET name = %s WHERE name = %s """, ("snake", "turtle")) print "Number of rows updated: %d" % cursor.rowcount
Так что вам просто нужно адаптировать это к своему собственному коду - пример:
cursor.execute (""" INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre, SongLength, SongLocation) VALUES (%s, %s, %s, %s, %s, %s) """, (var1, var2, var3, var4, var5, var6))
(Если SongLength является числовым, вам может потребоваться использовать% d вместо% s).
источник
%s
там независимо от типа. @sheki: ДаФактически, даже если ваша переменная (SongLength) числовая, вам все равно придется отформатировать ее с помощью% s, чтобы правильно привязать параметр. Если вы попытаетесь использовать% d, вы получите сообщение об ошибке. Вот небольшой отрывок из этой ссылки http://mysql-python.sourceforge.net/MySQLdb.html :
Для выполнения запроса вам сначала понадобится курсор, а затем вы можете выполнять по нему запросы:
c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (max_price,))
В этом примере max_price = 5 Почему же тогда использовать% s в строке? Поскольку MySQLdb преобразует его в буквальное значение SQL, которое представляет собой строку «5». Когда он закончится, запрос фактически скажет: «... WHERE price <5».
источник
В качестве альтернативы выбранному ответу и с той же безопасной семантикой, что и у Марселя, вот компактный способ использования словаря Python для указания значений. Его преимущество заключается в том, что его легко изменять при добавлении или удалении столбцов для вставки:
meta_cols=('SongName','SongArtist','SongAlbum','SongGenre') insert='insert into Songs ({0}) values ({1})'. .format(','.join(meta_cols), ','.join( ['%s']*len(meta_cols) )) args = [ meta[i] for i in meta_cols ] cursor=db.cursor() cursor.execute(insert,args) db.commit()
Где мета - словарь, содержащий значения для вставки. Обновление можно произвести аналогично:
meta_cols=('SongName','SongArtist','SongAlbum','SongGenre') update='update Songs set {0} where id=%s'. .format(','.join([ '{0}=%s'.format(c) for c in meta_cols ])) args = [ meta[i] for i in meta_cols ] args.append( songid ) cursor=db.cursor() cursor.execute(update,args) db.commit()
источник
Первое решение работает хорошо. Я хочу добавить сюда одну небольшую деталь. Убедитесь, что переменная, которую вы пытаетесь заменить / обновить, должна иметь тип str. Мой тип mysql является десятичным, но мне пришлось сделать переменную параметра как str, чтобы иметь возможность выполнить запрос.
temp = "100" myCursor.execute("UPDATE testDB.UPS SET netAmount = %s WHERE auditSysNum = '42452'",(temp,)) myCursor.execute(var)
источник
Вот еще один способ сделать это. Это задокументировано на официальном сайте MySQL. https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html
По духу он использует ту же механику, что и ответ @Trey Stout. Однако я нахожу этот более красивым и более читаемым.
insert_stmt = ( "INSERT INTO employees (emp_no, first_name, last_name, hire_date) " "VALUES (%s, %s, %s, %s)" ) data = (2, 'Jane', 'Doe', datetime.date(2012, 3, 23)) cursor.execute(insert_stmt, data)
И чтобы лучше проиллюстрировать необходимость в переменных:
NB: обратите внимание на совершаемый побег.
employee_id = 2 first_name = "Jane" last_name = "Doe" insert_stmt = ( "INSERT INTO employees (emp_no, first_name, last_name, hire_date) " "VALUES (%s, %s, %s, %s)" ) data = (employee_id, conn.escape_string(first_name), conn.escape_string(last_name), datetime.date(2012, 3, 23)) cursor.execute(insert_stmt, data)
источник