【问题标题】:How to query a JSON MySQL column into a dict?如何将 JSON MySQL 列查询为字典?
【发布时间】:2019-11-21 15:41:12
【问题描述】:

我的数据库如下所示:

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' }|
+------------------------+-----------------------------------------------+

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

我尝试过使用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 的方法?

【问题讨论】:

  • 您是否尝试将 JSON 内容作为字符串获取,然后通过 json 模块读取?
  • @GreenCloakGuy 这就是最终代码 sn-p 所做的。
  • thismorejson_stuff 列中 JSON 数据中的键。
  • 我添加了一个内联数据样本。
  • 它只多出一行,这在我的书中并不“丑陋”。就编写它所花费的时间而言,它相当有效。请说明您的要求。

标签: python json pymysql


【解决方案1】:

MySQL 开发人员显然认为驱动程序不适合在 JSON 数据类型和 Python 结构化类型之间进行自动转换。几年前提交了一个错误报告JSON columns should accept Python dicts as input。它被关闭为“不是错误”,并附有评论:

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

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

就我个人而言,我不同意他们的推理,我认为您的期望是合理的。但事实就是这样。

【讨论】:

  • 该报告中的讨论很有趣,并抓住了我正在尝试做的事情的精神。伴随着悲伤的长号音乐,恐怕我必须接受这个答案。
  • 总是很抱歉成为坏消息的带来者。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2020-04-02
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多