Python MySQL INSERT throws ProgrammingError: 1064
Python MySQL INSERT throws ProgrammingError: 1064
第一次提问。我正在编写一个供个人使用的 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)
数据库 table 定义如下 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 并添加所需的分号,它会按预期在 table 中插入一行。
我完全被问题所在困住了。
如果有任何帮助,我是 运行 Python 3.6.7 和 MariaDB 10.1.37 Connector/Python 8.0.15,Ubuntu 18.04 64-位.
不要使用 %s 作为 table 名称。直接使用table名称。
Table 名称不应替换为 %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"
所以只需在查询模板中使用 table 名称即可。
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))
第一次提问。我正在编写一个供个人使用的 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)
数据库 table 定义如下 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 并添加所需的分号,它会按预期在 table 中插入一行。
我完全被问题所在困住了。
如果有任何帮助,我是 运行 Python 3.6.7 和 MariaDB 10.1.37 Connector/Python 8.0.15,Ubuntu 18.04 64-位.
不要使用 %s 作为 table 名称。直接使用table名称。
Table 名称不应替换为 %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"
所以只需在查询模板中使用 table 名称即可。
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))