Python MySQL INSERT引发ProgrammingError:1064

时间:2019-03-15 06:44:41

标签: python mysql mysql-connector-python

首次提问。我正在编写一个供个人使用的Python应用程序,该应用程序将从CD-ROM上收集的MP3文件中读取元数据,并将其插入MySQL数据库中。至少应该如此-但是当涉及到实际的INSERT语句时,该程序将引发ProgrammingError:“ 1064:您的SQL语法有错误”,等等。

在尝试编写此程序时,我学习了如何创建参数化查询,如何使用 cursor_class = MySQLCursorPrepared 实例化游标对象,以及使用 use_pure = True 实例化数据库连接。强>。我已经在网上搜索了类似的问题,但还是干了。

这是令人讨厌的代码(专门引发异常的是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')

我在视觉上看不到任何错误,如果直接粘贴到MySQL CLI中并添加所需的分号,则会按预期在表中插入一行。

我完全受困于问题所在。

如果有帮助,我将在64位Ubuntu 18.04上运行带有Connector / Python 8.0.15的Python 3.6.7和MariaDB 10.1.37。

2 个答案:

答案 0 :(得分:0)

不要将%s用作表名。直接使用表名。

答案 1 :(得分:0)

表名不应替换为%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))