我想更新一个表,其中包含在MySQL数据库中的python脚本中创建的一些值。以下是问题所在:
dbCursor.execute("INSERT INTO Solution (ProblemName, TourLength, Date, Author, Algorithm, RunningTime, Tour) VALUES ('%s', '%d', '%s', '%s', '%s', '%d', '%s')" % (sys.argv[1], bestDist, "Foo Bar", "CURDATE()", "Greedy + 2-Opt", timeAllowed, bestRoute))
dbConnection.commit()
它产生了这个错误:
pymysql.err.InternalError: (1136, "Column count doesn't match value count at row 1")
我已经尝试使用Google搜索问题并搜索此网站以寻求解决方案,但我发现的那些都没有与我的完全匹配。由于这个原因,修复也没有解决我的问题。所以我不确定在这一点上我能做些什么。从我所看到的,我的所有列名称都匹配值和格式化的变量。
可能导致此问题的原因是什么?
CREATE TABLE IF NOT EXISTS Solution (
SolutionID int(11) NOT NULL AUTO_INCREMENT,
ProblemName varchar(32) NOT NULL,
TourLength double NOT NULL,
Date date DEFAULT NULL,
Author varchar(32) DEFAULT NULL,
Algorithm varchar(32) DEFAULT NULL,
RunningTime int(11) DEFAULT NULL,
Tour mediumtext NOT NULL,
CONSTRAINT SPK PRIMARY KEY (SolutionID),
CONSTRAINT SolPName FOREIGN KEY (ProblemName) REFERENCES Problem (Name) ON DELETE CASCADE
);
答案 0 :(得分:0)
问题在于使用%
运算符格式化SQL查询。特别是,您需要正确地转义参数,并且CURDATE()
也不应该被引用。
也就是说,依靠db驱动程序来插入查询参数会更好。为此,将它们作为元组传递给cursor.execute()
,如下所示:
sql = (
"INSERT INTO Solution (ProblemName, TourLength, Date, Author, Algorithm, "
" RunningTime, Tour) VALUES (%s, %s, CURDATE(), %s, %s, %s, %s)")
print(sql)
dbCursor.execute(sql, (sys.argv[1], bestDist, "Foo Bar", "Greedy + 2-Opt",
timeAllowed, bestRoute))