使用TypeError的Python MySQLdb插入:并非在字符串格式化期间转换所有参数

时间:2017-05-22 05:16:18

标签: python mysql

我无法通过python将记录插入mysql,如下所示:

songs = ['abc','bbb']

for i in songs:

      cur.execute("INSERT INTO song (title) VALUE (%s)", i)

我收到如下错误:

  

回溯(最近一次呼叫最后):文件“”,第2行,in      文件   “/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py”,第187行,   执行中       query = query%tuple([db.literal(item)for args中的item])TypeError:并非在字符串格式化过程中转换所有参数

我的问题排查步骤:

  1. 插入单独的:

    cur.execute('INSERT INTO song (title) VALUE ("haha")')

  2. - >成功

    1. 仅使用“for”脚本插入列表中的一个字符:

      songs = ['a','b','c']

      for i in songs:

      `cur.execute("INSERT INTO song (title) VALUE (%s)", i)`
      
    2. --->成功

3 个答案:

答案 0 :(得分:1)

使用像这样的字符串作为第二个参数不起作用。这里的问题是execute()的第二个参数应该是一个序列(列表,元组等)。字符串本身就是一系列字符:['a', 'b', 'c']

在您的示例中,第一个字符(a)被视为第一个格式参数(%s)。在那之后,字符串的其余部分被认为是#34;太多"参数。

您需要传递第一项是字符串的序列:

cur.execute("INSERT INTO song (title) VALUES (%s)", (i,))

这表示元组(序列)包含一个元素i

的格式

请注意,这与@ kuro的答案不同,因为它允许库正确地转义值,这样更安全,并正确处理不同的值类型。

答案 1 :(得分:-1)

我认为你应该使用:

cur.execute("INSERT INTO song (title) VALUES (%s)", i)

答案 2 :(得分:-2)

如果你想跟着你,请尝试 -

songs = ['a','b','c']

for i in songs:
    cur.execute("INSERT INTO song (title) VALUES ('%s')" %(i,))
#Use commit here or turn auto-commit on

看一下这个链接 -

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html