使用executemany从pandas数据框更新mysql数据库

时间:2017-07-21 14:54:53

标签: python mysql python-2.7 mysql-python

我正在使用mysqldb尝试更新数据库中的大量记录。

cur.executemany("""UPDATE {} set {} =%s Where id = %s """.format(table, ' = %s, '.join(col)),updates.values.tolist())

我收到错误消息......

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near...

所以我尝试输出实际的sql update语句,因为使用以下代码该错误消息没有帮助:

cur.execute('set profiling = 1')
    try:

        cur.executemany("""UPDATE {} set {} =%s Where id = %s """.format(table, ' = %s, '.join(col)),updates.values.tolist())
    except Exception:
        cur.execute('show profiles')
        for row in cur:
            print(row)

该print语句似乎以300个字符切断了更新语句。我无法在文档中找到有关限制的任何内容,所以我想知道这是限制打印语句还是mysqldb?

我是否可以使用python而非mysqldb生成更新语句以查看完整语句?

1 个答案:

答案 0 :(得分:1)

要确切了解光标的执行情况,可以使用API​​中显示的here cursor.statement命令。这可能有助于调试。

我没有使用mySQL适配器的经验,但我每天都使用PostgreSQL适配器。至少在该上下文中,建议不要直接格式化查询字符串,而是让cursor.execute语句中的第二个参数进行替换。这避免了引用字符串等问题。这是一个例子,第二个是正确的(至少对于Postgres):

cur.execute("""UPDATE mytbl SET mycol = %s WHERE mycol2 = %s""".format(val, cond))

cur.execute("""UPDATE mytbl SET mycol = %(myval)s WHERE mycol2 = %(mycond)s""", {'myval': val, 'mycond': cond})

这可能导致查询

  

UPDATE mytbl SET mycol = abc WHERE mycol2 = xyz

而不是

  

UPDATE mytbl SET mycol ='abc'WHER mycol2 ='xyz'。

如果您自己在查询中执行值替换,则需要显式添加这些引号,这会变得烦人并绕过数据库适配器的类型处理(请记住,这只是一个文本示例)。 See the API获取有关此表示法和cursor.executemany命令的更多信息。