适用于MySQL的Peewee ORM JSONField

Var*_*rma 3 python mysql orm python-2.7 peewee

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

class User(peewee.Model):
    name = peewee.CharField(unique=True)
    some_json_data = peewee.CharField()
    requested_at = peewee.DateTimeField(default=datetime.now())
Run Code Online (Sandbox Code Playgroud)

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

比方说,这是我写给DB的JSONField:

[
  {
    'name': 'abcdef',
    'address': 'abcdef',
    'lat': 43176757,
    'lng': 42225601
  }
]
Run Code Online (Sandbox Code Playgroud)

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

u'[{u\'name\': u\'abcdef\',  u\'address\': u\'abcdef\', u\'lat\': 43176757, u\'lng\': 42225601\'}]'
Run Code Online (Sandbox Code Playgroud)

尝试simplejson加载这个给我一个错误,如下所示:

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

我已经尝试过json数据的json转储,然后再将它输入数据库并查看是否有效,但我仍然没有运气.

我正在寻找一个涉及peewee 自定义字段选项的解决方案,我想坚持我的MySQL.有人可以指导我吗?

Ben*_*oyt 8

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

看起来有一个Peewee playhouse扩展为某些定义了JSONField类型的数据库(SQLite,PostgreSQL?)定义- 请参阅这里的JSONField文档.

或者,我认为定义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)
Run Code Online (Sandbox Code Playgroud)