2016-11-11 3 views
2

У меня есть peewee модель как так:Peewee ORM JSONField для MySQL

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

Я знаю, что Peewee не поддерживает JSONField для БД MySQL, но в любом случае, я, хотя, если я мог бы просто превратить его в строковый формат и сохранить в 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: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

Я попытался JSon сбросы JSON данных, прежде чем вводить его в БД и видеть, что-то будет работать, но все же мне не повезло с этим.

Я ищу решение, которое включает в себя опции peewee custom field, и я хочу придерживаться своего MySQL. Может ли кто-нибудь меня вести?

ответ

5

Что происходит в вашем коде, Peewee вызывает str() (или unicode()) на значение вместо того, чтобы сбрасывать его в JSON, поэтому строковое представление Python сохраняется в базе данных. Чтобы выполнить JSON вручную, просто import json, а затем позвоните по номеру json.dumps(obj), когда вы устанавливаете поле и json.loads(db_value), когда вы выбираете поле.

Похоже, что для определенных баз данных (SQLite, PostgreSQL?) Определено расширение игрового дома Peewee, которое определило тип JSONField - см. 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^