我在将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需要映射
任何人都可以帮我看看我做错了吗?
谢谢!
答案 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])