【问题标题】:TypeError when inserting elements from list into mysql database将列表中的元素插入mysql数据库时出现TypeError
【发布时间】:2018-01-04 18:37:20
【问题描述】:

我正在尝试使用 python、mysql 数据库和 mysqldb 将列表中的每个值插入到数据库中。数据库中此列表中所有元素的类型为 VARCHAR。

但我收到此错误:

TypeError:字符串格式化期间并非所有参数都转换

列表理解是删除空字符串,为了尝试解决当前的问题,我尝试将每个元素转换为字符串,但没有成功。我也尝试将其转换为查询函数中的字符串,但也没有成功。

值为-3.89738e-05

类型(值)是“类型'str'”

for scan in outer:
    scan = [str(x) for x in scan if x]
    for value in scan:
        print value
        print type(value)
        sql_insert = ('INSERT INTO langmuir_data(currentI)'
                      'VALUES("%s")')
        cursor.execute(sql_insert, str(value))

有人知道我为什么会收到这个错误以及如何解决它吗?

【问题讨论】:

  • 如果您的查询是 sql_insert = """INSERT INTO langmuir_data (currentI) VALUES (%s)"""cursor.execute(sql_insert, (str(value),)) 会发生什么?
  • 同样的事情发生,两者都是有效的语法。我之前已经成功地将该语法用于该程序中的其他程序和其他列表
  • 好吧,在我使用 SQL 之前,它们会做不同的事情,因为您没有将参数作为元组传递。你复制/粘贴了我写的两行?
  • 没有看到第二行的区别,但现在已经改变了,它可以工作了!谢谢,你想添加你的评论作为答案,我会接受。为什么将它作为元组传递会改变它?

标签: python mysql-python


【解决方案1】:

当您执行参数化查询时,它期望参数以可迭代的形式传递(我在评论中放入的元组)。当您传递多个参数时,您不会发现任何问题,因为它会将这些参数解压缩到您提供的占位符中。但是,当您传递单个字符串时,它在 Python 中仍然是可迭代的,因此它会尝试将该字符串逐个字符地插入到您准备好的语句中。

for item in ('abc',):
    print item # prints whole string, for which you provided a placeholder

for item in 'abc':
    print item # prints the individual letters, but you only gave 1 placeholder

因此,您应该使用以下内容:

cursor.execute(sql_insert, (str(value),))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多