如何将 JSON MySQL 列查询到字典中



我的数据库看起来像这样:

CREATE TABLE my_table( irrelevant_column TEXT, json_stuff JSON );
mysql> SELECT * FROM my_table;
+------------------------+-----------------------------------------------+
| irrelevant_column      | json_stuff                                    |
+------------------------+-----------------------------------------------+
| blah blah              | { 'this': 'is my json data' }                 |
| more unrelated stuff   | { 'more': 'of my data in the correct format' }|
+------------------------+-----------------------------------------------+

我正在寻找一种优雅的方式来将 JSON 数据从 MySQL 查询到字典列表中。

我试过使用DictCursor

cursor = connection.cursor( pymysql.cursors.DictCursor )
cursor.execute( "SELECT json_stuff FROM my_table" )
rows = cursor.fetchall()

但它不能正确处理 JSON 列类型。它返回以下内容:

[
  { "json_stuff": "<json_stuff row 1 in string format>" },
  { "json_stuff": "<json_stuff row 2 in string format>" }, 
  etc.
]

我想要

[
  { 'this': 'is my json data' },
  { 'more': 'of my data in the correct format' }, 
  etc.
]

这种丑陋而低效的代码有效。

def get_list_of_stuff():
    cursor = connection.cursor()
    cursor.execute( "SELECT json_stuff FROM my_table" )
    rows = cursor.fetchall()
    return [ json.loads( row["json_stuff"] ) for row in rows ]

有谁知道一种方法可以做到这一点,而无需遍历所有行并将每行解析为 JSON?

MySQL开发人员显然认为驱动程序在JSON数据类型和Python结构化类型之间自动转换是不合适的。错误报告 JSON 列应该接受 Python 字典,因为输入是在几年前提交的。它被关闭为"不是错误",并附有评论:

因为JSON不是内置类型(甚至不是Python中的类型(。这种转换不应该在驱动程序中进行,更适合具有高度抽象的框架。

由于您没有使用框架,而只是使用低级数据库 API,因此您需要自己进行解析。

当然,我不同意他们的推理,我认为你的期望是合理的。但事实就是如此。

最新更新