【问题标题】:Inserting multiple dictionary objects into a MySQL database using python and MySQLdb使用 python 和 MySQLdb 将多个字典对象插入 MySQL 数据库
【发布时间】:2013-01-21 18:39:24
【问题描述】:

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

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

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 数据库的问题,而是我如何将变量传递到数据库中。

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

【问题讨论】:

  • mydata 是一个字典列表(如上定义)。

标签: python mysql database mysql-python


【解决方案1】:

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

cur.executemany(sql, mydata)

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

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

  • 确保提交事务;在.executemany() 调用之后运行con.commit()

  • 三重检查mydata 不为空。

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

【讨论】:

  • 当我这样做时,什么也没有发生。脚本执行并完成,没有错误,没有插入任何行。
  • @user1464409:请分享一下mydata 是什么。
  • mydata = [ { 'id': 123, 'thing': 'ghi', 'value': 1 }, { 'id': 456, 'thing': 'xyz', 'value ': 0 } ]
  • @user1464409:我怀疑 executemany() 不支持字典。现在检查代码。
  • @user1464409:您100%确定该列表不为空吗?该代码当然可以为.execute().executemany() 正确处理%(name)sdict 插值。
【解决方案2】:

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

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

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

说实话,你原来的 sn-p 对我来说很好用。所以这主要是一个自动提交问题。

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

con.commit()

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

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

【讨论】:

    【解决方案3】:

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

    mydata_modified = []
    for x in mydata:
       mydata_modified.append(tuple(x.values()))
    

    【讨论】:

    • 错误,因为x.values()的顺序可能和预期的sql查询不一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2011-01-11
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多