我使用之前多次使用的Python脚本将CSV数据加载到MySQL表中。
我修改了脚本以获得一个非常简单的插入,但它失败了,我不明白为什么。
我已经浏览了Python连接器的MySQL文档,比较了我的语法,我浏览了Stackoverflow上的所有相关文章,但我找不到原因。我还检查了我使用的引号,因为这是一个常见错误。
也许有人可以提供帮助:
if row[0]:
s=row[0]
d=s[s.rfind('/')+1:len(s)-4]
cursor.execute("INSERT INTO `tab` (`did`) VALUES (%s)",(d))
我已检查过打印(d)并正确填充了d。
我得到的错误是
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 接近'%s)'在第1行
如果有人能发现(可能非常愚蠢)错误,请提供帮助。感谢。
答案 0 :(得分:2)
问题在于
cursor.execute("INSERT INTO `tab` (`did`) VALUES (%s)",(d))
作为params传递的(d)
是一个带有括号的字符串,而不是元组。
这是一个mysql-connector cursor checks its params:
的方式if params is not None:
if isinstance(params, dict):
for key, value in self._process_params_dict(params).items():
stmt = stmt.replace(key, value)
elif isinstance(params, (list, tuple)):
psub = _ParamSubstitutor(self._process_params(params))
stmt = RE_PY_PARAM.sub(psub, stmt)
if psub.remaining != 0:
raise errors.ProgrammingError(
"Not all parameters were used in the SQL statement")
所以在你的情况下,虽然 params 不是None
,但它也不被接受为params并且不会发生参数替换。
然后修复只是将元组传递给cursor.execute()
(list
也可以):
cursor.execute("INSERT INTO `tab` (`did`) VALUES (%s)", (d,))
答案 1 :(得分:1)
我认为你的字符串格式化是错误的。应该是:
cursor.execute("INSERT INTO `tab` (`did`) VALUES (?)",d)
但您应该检查数据库库的文档。我很确定问题出在查询中的占位符上。