插入MySQL失败,错误

时间:2016-05-25 10:59:37

标签: python mysql

我使用之前多次使用的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行

如果有人能发现(可能非常愚蠢)错误,请提供帮助。感谢。

2 个答案:

答案 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)

但您应该检查数据库库的文档。我很确定问题出在查询中的占位符上。