Python MySQL INSERT выдает ProgrammingError: 1064

Первый вопрос. Я пишу приложение 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.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
511
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не используйте %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))

Хорошо, я заменил %s именем таблицы (и удалил табличную переменную из входного кортежа). Это решило насущную проблему (спасибо!): я больше не получаю ошибку 1064 (ура!). Но теперь я получаю ProgrammingError: 1210: «Неверное количество аргументов при выполнении подготовленного оператора». Опять же, я не вижу проблемы; теперь есть 7 заполнителей и 7 значений.

RansomOttawa 15.03.2019 07:59

@RansomOttawa И, пожалуйста, не цитируйте %s. Одинарная кавычка будет добавлена ​​автоматически.

Yang HG 15.03.2019 08:04

Спасибо еще раз! Удаление кавычек вокруг заполнителей %s помогло. Я так понимаю, что если для буквального запроса потребуются кавычки (например, вокруг строки), библиотека предоставит их мне? Документация и примеры, которые я нашел в сети, не совсем ясны по этому поводу.

RansomOttawa 15.03.2019 08:12

@RansomOttawa Мммм ... Да, кавычки должны заключать строку, но не заполнители. Я снова отредактировал свой ответ, если вы хотите знать, что запрос будет выполнен, используйте приведенный выше код.

Yang HG 15.03.2019 08:16

Другие вопросы по теме