MySQL 的 Peewee ORM JSONField

Peewee ORM JSONField for MySQL

我有一个像这样的 peewee 模型:

class User(peewee.Model):
    name = peewee.CharField(unique=True)
    some_json_data = peewee.CharField()
    requested_at = peewee.DateTimeField(default=datetime.now())

我知道 peewee 不支持 MySQL 数据库的 JSONField,但无论如何,我认为如果我可以将它转换为字符串格式并保存到数据库,我可以按原样检索它.

例如,这是我正在写入数据库的 JSONField:

[
  {
    'name': 'abcdef',
    'address': 'abcdef',
    'lat': 43176757,
    'lng': 42225601
  }
]

当我获取此 (JSONField) 数据时,输出如下所示:

u'[{u\'name\': u\'abcdef\',  u\'address\': u\'abcdef\', u\'lat\': 43176757, u\'lng\': 42225601\'}]'

尝试一个简单的json 负载给我这样的错误:

JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

我已经尝试 json 转储 json 数据,然后再将其输入数据库并查看是否可行,但我仍然没有运气。

我正在寻找涉及 peewee 的 custom field 选项的解决方案,我想坚持我的 MySQL。有人可以指导我吗?

您的代码中可能发生的情况是 Peewee 正在调用 str()(或 unicode())值而不是将其转储到 JSON,因此 Python 字符串表示正在保存到数据库中。要手动执行 JSON,只需 import json,然后在设置字段时调用 json.dumps(obj),在获取字段时调用 json.loads(db_value)

似乎为某些数据库(SQLite、PostgreSQL?)定义了一个 Peewee playhouse 扩展,它定义了一个 JSONField 类型——参见 JSONField docs here

或者,我认为定义一个自动执行 json loads/dumps 的自定义 JSONField 类型并不困难。 playhouse/kv.py:

中有一个简单的例子
class JSONField(TextField):
    def db_value(self, value):
        return json.dumps(value)

    def python_value(self, value):
        if value is not None:
            return json.loads(value)