【问题标题】:Peewee ORM JSONField for MySQL用于 MySQL 的 Peewee ORM JSONField
【发布时间】:2017-03-26 00:38:57
【问题描述】:

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

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

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

假设,例如,这是我写入数据库的 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\'}]'

尝试对此的 simplejson 加载给了我这样的错误:

JSONDecodeError:期望用双引号括起来的属性名称: 第 1 行第 3 列(字符 2)

在将 json 数据输入数据库之前,我已经尝试过对 json 数据进行 json 转储并查看是否可行,但我仍然没有运气。

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

【问题讨论】:

    标签: python mysql python-2.7 orm peewee


    【解决方案1】:

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

    似乎为某些定义了JSONField 类型的数据库(SQLite、PostgreSQL?)定义了 Peewee playhouse 扩展——请参阅JSONField docs here

    另外,我认为定义一个自定义 JSONField 类型来自动加载/转储 json 并不难。 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)
    

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多