使用python和MySQLdb将多个字典对象插入MySQL数据库

use*_*409 1 python mysql database mysql-python

我已经为此苦苦挣扎了好几个小时,现在我想哭了,因为我无法弄清正在发生的事情。

这是我的数据的简化版本:

mydata = [ { 'id': 123, 'thing': 'ghi', 'value': 1 }, { 'id': 456, 'thing': 'xyz', 'value': 0 } ]
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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()
Run Code Online (Sandbox Code Playgroud)

我期望发生的是将2行插入到tablename中。实际发生的情况是脚本执行时没有任何错误,并且没有插入行。

我究竟做错了什么?如果我手动执行单个INSERT,则它会正确插入表中,因此我认为这不是MySQL数据库的问题,而是我如何将变量传递到数据库中。

我还有一个问题是如何将值插入为浮点数?目前,我在表中将值的定义定义为TINYTEXT NOT NULL,我希望它是FLOAT NOT NULL,但是我不确定如何处理上面的替换。

Mar*_*ers 5

无需使用生成器进行循环mydata。只需mydata直接传递:

cur.executemany(sql, mydata)
Run Code Online (Sandbox Code Playgroud)

数据库适配器将为mydata您循环,并且生成器表达式只会插入不必要的额外循环。

如果您没有收到任何错误消息,但也没有任何更改,请检查以下内容:

  • 确保您提交交易;通话con.commit()后运行.executemany()。

  • TRIPPLE检查是mydata不是空的。

数据库适配器将为您正确处理浮点值。如果列被标记为,FLOAT NOT NULL并且您为该列传递了Python浮点值,则事情将正常进行。这就是SQL参数的用途,可以正确处理不同数据类型的引用。