2

我已经为此苦苦挣扎了好几个小时,现在我想哭,因为我无法弄清楚发生了什么。

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

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()

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

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

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

4

3 回答 3

6

无需使用生成器来循环mydata。直接传入mydata即可:

cur.executemany(sql, mydata)

数据库适配器将为mydata您循环,生成器表达式仅插入一个不必要的额外循环。

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

  • 确保你提交了交易;呼叫con.commit()后运行。.executemany()

  • 三重检查mydata为空。

数据库适配器将为您正确处理浮点值;如果一列被标记为FLOAT NOT NULL并且您为该列传递了一个 Python 浮点值,那么 Things Just Work。这就是 SQL 参数的用途,正确处理不同数据类型的引用。

于 2013-02-06T14:18:14.043 回答
2

默认情况下,在 MYSQL 中启用自动提交。要检查您设置中的当前配置,请连接到您的 MYSQL 实例并执行以下操作。

mysql> select @@autocommit;    
+--------------+    
| @@autocommit |    
+--------------+    
|            1 |    
+--------------+
1 row in set (0.00 sec)

如果值为 1 则启用...否则不...

老实说,您的原始片段对我来说很好。所以这主要是一个自动提交问题。

con.close()尝试在原始代码之前添加以下行。

con.commit()

如果启用了自动提交,您仍然可以尝试使用下面发布的我的代码片段...您可以将 mydata 列表成员从 Dictionary 更改为 Tuple 类型吗?如果是,请查看以下代码段是否对您有帮助。

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()
于 2013-02-06T15:22:15.020 回答
0

只是一个在 Guddu 上扩展的 FYI,您可以通过执行以下操作将您的字典转换为元组类型:

mydata_modified = []
for x in mydata:
   mydata_modified.append(tuple(x.values()))
于 2016-01-04T18:15:34.013 回答