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

时间:2011-03-11 19:56:15

标签: python mysql

我在将CSV文件加载到mysql数据库时遇到了一些麻烦。这是我的代码:

for q in csvReader:
    name, price, LastUpdate, today = q
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(name, price, LastUpdate);""",q)

我收到一条错误,提到TypeError:在字符串格式化过程中没有转换所有参数。

name列是字符串,price是float,LastUpdate是日期。我读了一下,看到一些脚本包含%(值)s和%(值)d的值(在我的情况下,而不是d我使用f),但后来我得到了一个不同的错误:

TypeError:format需要映射

任何人都可以帮我看看我做错了吗?

谢谢!

3 个答案:

答案 0 :(得分:14)

如果我没记错的话,你应该在查询中使用%s和MySQLdb来表示你想要对参数元组元素进行格式化的位置。这与大多数其他实现中使用的通常?占位符不同。

for q in csvReader:
    name, price, LastUpdate, today = q
    co.execute("INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %s, %s);",q)

编辑:这里也是一次插入多行的示例,这比逐个插入它们更有效。来自MySQLdb User's Guide

c.executemany(
      """INSERT INTO breakfast (name, spam, eggs, sausage, price)
      VALUES (%s, %s, %s, %s, %s)""",
      [
      ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
      ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
      ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
      ] )
  

这里我们插入三行五个值。请注意,有   混合类型(字符串,整数,浮点数)虽然我们仍然只使用%s。   另请注意,我们只包含一行的格式字符串。   MySQLdb选择那些并为每一行复制它们。

答案 1 :(得分:5)

从错误消息中,execute()方法使用%将您的参数替换为SQL语句。但是你没有说明它们中的任何一个,所以没有你的参数被使用,它们都被遗留下来,因此你得到了关于剩下一些的消息(嘿,一切都是一些!)。阅读数据库驱动程序的文档,找出它希望您用作替换标记的内容;可能是%s

答案 2 :(得分:1)

格式要求映射是因为您要为字符串替换标记设置名称,并且需要字典。

如果你把它们留作%s%d%f等而不用括号,它将从列表或元组(q)中按顺序取出参数

for q in csvReader:
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %f, %s);""",q[:-1])