我一直在努力与这几个小时,我觉得现在哭泣我无法捉摸发生了什么事。
这是我的数据的简化版本:
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()
我希望发生的是,两行会被插入到表名 。 而实际上,该脚本执行没有任何错误,且行插入。
我究竟做错了什么? 如果我用手工做一个INSERT其插入到表正确,所以我想知道它不与MySQL数据库的问题,而是如何我传递变量到数据库中。
另外一个问题,我是如何我插入值作为浮动? 目前,我在表中TINYTEXT NOT NULL的价值定义,我想这是FLOAT NOT NULL,但我不知道如何处理上述substition。
有没有必要在使用发电机循环mydata
。 只是通过在mydata
直接:
cur.executemany(sql, mydata)
数据库适配器将遍历mydata
为你和发电机表达只插入一个不必要的额外的循环。
如果你没有得到任何错误消息,但没有任何变化,检查以下内容:
数据库适配器将正确处理您的浮点值; 如果列被标记为FLOAT NOT NULL
,你在一个Python浮点值,通过该列,事情就工作。 这就是SQL参数是,正确处理不同的引用数据类型。
默认情况下,MySQL是启用自动提交。 要检查您的设置当前配置,请连接到您的MySQL实例并执行以下操作。
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
如果该值为1,则启用它......否则不....
说实话,你原来的代码段工作正常,我。 因此,这可能主要是自动提交的问题。
尝试添加以下行之前con.close()
在你的原代码。
con.commit()
你仍然可以给我的片段一试贴,如果自动提交启用下面...你能够在MYDATA列表成员从字典改变元组类型? 如果是的话,请看看下面的代码片段可以帮助你。
import MySQLdb as mdb
mydata = [ { 'id': 123, 'thing': 'ghi', 'value': 1 }, { 'id': 456, 'thing': 'xyz', 'value': 0 } ]
mydata_modified=[ (123, 'ghi', 1 ), ( 456, 'xyz', 0 ) ]
con = None
con = mdb.connect('localhost', 'testing', 'anothervalue', 'andanother');
cur = con.cursor()
cur.executemany( """INSERT INTO tablename ( id, thing, value ) VALUES ( %s, %s, %s )""", mydata_modified )
con.commit()
con.close()
只是一个供参考,以扩大Guddu,您可以将您的字典元组类型做一样的东西:
mydata_modified = []
for x in mydata:
mydata_modified.append(tuple(x.values()))
文章来源: Inserting multiple dictionary objects into a MySQL database using python and MySQLdb