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)
我有一个像这样的 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)