我已经挣扎了好几个小时,现在我想哭了,因为我不知道发生了什么。
以下是我的数据的简化版本:

mydata = [ { 'id': 123, 'thing': 'ghi', 'value': 1 }, { 'id': 456, 'thing': 'xyz', 'value': 0 } ]

这是我的密码:
import MySQLdb as mdb

con = None
con = mdb.connect('localhost', 'testing', 'anothervalue', 'andanother');
cur = con.cursor()

sql = "INSERT INTO `tablename` ( `id`, `thing`, `value` ) VALUES ( %(id)s, %(thing)s, %(value)s )"
cur.executemany( sql, ( mine for mine in mydata ) )
con.close()

我希望在tablename中插入两行。实际发生的情况是脚本执行时没有任何错误,也没有插入行。
我做错什么了?如果我手工插入一个变量,它会正确地插入到表中,所以我想知道这不是mysql数据库的问题,而是我如何将变量传递到数据库中。
另外一个问题是如何将值作为浮点数插入?目前,表中的value定义为tinytext not null,我希望它是float not null,但我不确定如何处理上面的子字符串。

最佳答案

不需要使用生成器循环mydata。直接进入:

cur.executemany(sql, mydata)

数据库适配器将为您循环mydata,生成器表达式只插入不必要的额外循环。
如果没有收到任何错误消息,但也没有更改,请检查以下内容:
确保提交事务;在调用后运行mydata
三重检查con.commit()是否为空。
数据库适配器将为您正确地处理浮点值;如果一个列被标记为.executemany(),并且您为该列传递了一个python浮点值,则一切正常。这就是sql参数的用途,正确处理不同数据类型的引用。

10-06 06:11
查看更多