Python MySQL 连接器执行带有额外值的many

标签 python mysql dictionary

使用 MySQL 的 executemany() 插入数据时,是否有内置方法可以忽略字典中的字段?

我需要从 JSON 文件中提供给我的相对较大的数据集中插入数据。 JSON 数据的基本布局如下:

{
    "data" : [
        { "f1" : 42, "f2" : "abc", "f99" : "useless stuff" },
        { "f1" : 43, "f2" : "def", "f99" : [ "junk", "here" ] },
        { "f1" : 44, "f2" : "ghi", "f99" : { "thing" : 99 } }
    ]
}

我的插入设置如下所示:

import json
import mysql.connector
with open( 'huge_data_dump.json', 'rb' ) as fh:
    data = json.load( fh )
connection = mysql.connector.connect( **mysql_config )
cursor = connection.cursor()
query = 'INSERT INTO `example` ( `f1`, `f2` ) VALUES ( %(f1)s, %(f2)s )'
cursor.executemany( query, data[ 'data' ] )
cursor.close()
connection.close()

目标表如下所示:

CREATE TABLE `example` ( `f1` INT, `f2` VARCHAR( 10 ) )

但是,当我运行此命令时,出现错误:

Failed processing pyformat-parameters; Python 'list' cannot be converted to a MySQL type

如果我将导入限制为仅示例数据集中的第一行,则插入效果完美:

cursor.executemany( query, data[ 'data' ][ : 1 ] )

问题来自于 f99 字段中的无关数据,这些数据包含谁知道什么。这对我来说很好:我不需要来自 f99 的任何信息。但是,MySQL 连接器似乎希望在检查查询以查看是否需要该值之前将整个记录的字典转换为安全字符串。

我尝试使用生成器函数将数据集过滤到对 executemany() 的调用中,但连接器提示只能接受元组和列表(我觉得这是一个相当不- Pythonic 接口(interface))。

我的最后一招是将数据复制到新字典中,并在将数据传递给 executemany() 之前过滤掉不需要的字段。然而,这些数据集已经足够大,我正在考虑一次从 JSON 源文件中以数百个插入为一组进行流式传输。尝试消除所有不需要的数据的额外循环将是一种浪费,并且需要维护更多代码。我真诚地希望我忽略了文档未涵盖或掩盖的内容。

我想我可以开始研究对输入的一些自定义 JSON 过滤,但是,我再次希望有一种简单的内置方法来解决(似乎是)相对常见的用例。

最佳答案

您可以使用生成器为数据列表中的每条记录创建所需列的元组:

(d["f1"], d["f2"] for d in data['data'])

将此生成器传递给executemany 函数应该按预期工作。

编辑:您可能需要将查询更改为

query = 'INSERT INTO `example` ( `f1`, `f2` ) VALUES ( %s, %s )'

但我对此不太确定。

关于Python MySQL 连接器执行带有额外值的many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31194038/

相关文章:

php - Mysql如何获取数据库中多列的SUM

python - 如何在 Huggingface 模型中获得 token 的概率分布?

mysql - MySQL 的 LIMIT 关键字是否保证返回数据的顺序?

mysql - 使用 MySQL Workbench 远程连接 VPS 服务器上的 MySQL

Python:根据键的值在数组中查找字典

javascript - 用 forEach 重写 Map

ios - swift 中字典声明的不同方式有哪些

python - 为什么此代码仅适用于 Something() 中的 *args?

python - 单个 python 文件中的多个类具有不同的依赖关系

python - python 中的 Ical - 删除事件