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,但是我不确定如何处理上面的替换。
无需使用生成器进行循环mydata。只需mydata直接传递:
cur.executemany(sql, mydata)
Run Code Online (Sandbox Code Playgroud)
数据库适配器将为mydata您循环,并且生成器表达式只会插入不必要的额外循环。
如果您没有收到任何错误消息,但也没有任何更改,请检查以下内容:
确保您提交交易;通话con.commit()后运行.executemany()。
TRIPPLE检查是mydata不是空的。
数据库适配器将为您正确处理浮点值。如果列被标记为,FLOAT NOT NULL并且您为该列传递了Python浮点值,则事情将正常进行。这就是SQL参数的用途,可以正确处理不同数据类型的引用。