Первый вопрос. Я пишу приложение Python для личного пользования, которое считывает метаданные из файлов MP3, которые я собрал на компакт-дисках, и вставляет их в базу данных MySQL. По крайней мере, так и должно быть, но когда дело доходит до фактического оператора INSERT, программа выдает ProgrammingError: «1064: у вас есть ошибка в синтаксисе SQL» и т. д.
Пытаясь написать эту программу, я научился создавать параметризованные запросы, создавать экземпляр объекта курсора с помощью cursor_class = MySQLCursorPrepared и создавать экземпляр соединения с базой данных с помощью use_pure = Истина. Я искал в Интернете похожие проблемы, но ничего не нашел.
Вот код нарушения (исключение вызывает именно строка cursor.execute; в целях отладки я временно удалил блоки try/except):
table = "mp3_t"
# Parameterized query for SQL INSERT statement
query = '''
INSERT INTO %s
(track_num, title, artist, album, album_year, genre, discname)
VALUES
(%s, '%s', '%s', '%s', %s, '%s', '%s')
'''
conn = self.opendb(self.config)
cursor = conn.cursor(cursor_class = MySQLCursorPrepared)
for track in tracklist:
print("Counter: {}".format(counter))
# Tuple for parameterized query
input = (table, track['track_num'], track['title'],
track['artist'], track['album'], track['album_year'],
track['genre'], track['discname'])
print(query % input) # What is the actual query?
cursor.execute(query, input)
Таблица базы данных определяется с помощью следующего SQL:
CREATE TABLE mp3_t (
id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
track_num int NOT NULL,
title VARCHAR(255) NOT NULL,
artist VARCHAR(255) NOT NULL,
album VARCHAR(255) NOT NULL,
album_year int NOT NULL,
genre VARCHAR(255) NOT NULL,
discname VARCHAR(255) NOT NULL);
Для отладки у меня есть оператор печати, который выводит запрос, отправляемый в MySQL (сообщение об ошибке особенно бесполезно при попытке точно определить причину проблемы), например:
INSERT INTO mp3_t
(track_num, title, artist, album, album_year, genre, discname)
VALUES
(1, 'Moribund the Burgermeister', 'Peter Gabriel', 'I', 1977, 'Rock', 'Rock 19')
Визуально я не вижу никакой ошибки, и если я вставляю непосредственно в CLI MySQL и добавляю требуемую точку с запятой, он вставляет строку в таблицу, как и ожидалось.
Я полностью зашел в тупик, где проблема.
Если это поможет, я использую Python 3.6.7 и MariaDB 10.1.37 с Connector/Python 8.0.15 на 64-разрядной версии Ubuntu 18.04.






Не используйте %s для имени таблицы. Используйте имя таблицы напрямую.
Название таблицы не должно заменяться на %s. Я думаю, что ваше сообщение об ошибке должно выглядеть так:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near "mp3_t"
Поэтому просто используйте имя таблицы в шаблоне запроса.
INSERT INTO mp3_t
(track_num, title, artist, album, album_year, genre, discname)
VALUES
(%s, %s, %s, %s, %s, %s, %s)
Если вы хотите знать, что запрос будет выполнен, вы должны использовать эти коды:
conn = connect()
cur = conn.cursor()
print(query % cur._get_db().literal(params))
@RansomOttawa И, пожалуйста, не цитируйте %s. Одинарная кавычка будет добавлена автоматически.
Спасибо еще раз! Удаление кавычек вокруг заполнителей %s помогло. Я так понимаю, что если для буквального запроса потребуются кавычки (например, вокруг строки), библиотека предоставит их мне? Документация и примеры, которые я нашел в сети, не совсем ясны по этому поводу.
@RansomOttawa Мммм ... Да, кавычки должны заключать строку, но не заполнители. Я снова отредактировал свой ответ, если вы хотите знать, что запрос будет выполнен, используйте приведенный выше код.
Хорошо, я заменил %s именем таблицы (и удалил табличную переменную из входного кортежа). Это решило насущную проблему (спасибо!): я больше не получаю ошибку 1064 (ура!). Но теперь я получаю ProgrammingError: 1210: «Неверное количество аргументов при выполнении подготовленного оператора». Опять же, я не вижу проблемы; теперь есть 7 заполнителей и 7 значений.