2017-01-26 3 views
0

Я использую django 1.8.9 и MySQL 5.7.17. У меня есть следующая таблица:Обновление поля Mysql JSON

+----------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+----------+--------------+------+-----+---------+----------------+ 
| brand | varchar(255) | YES | MUL | NULL |    | 
| new_info | json   | YES |  | NULL |    | 
| keywords | json   | YES |  | NULL |    | 
| notes | varchar(255) | YES |  | NULL |    | 
| id  | mediumint(9) | NO | MUL | NULL | auto_increment | 
+----------+--------------+------+-----+---------+----------------+ 

В Джанго У меня есть эта модель (JSONField от django_mysql):

class info_by_kw(Model): 
    brand = ForeignKey(Brand, on_delete=CASCADE, db_column='brand') 
    # new_info = JSONField(blank=True, null=True) 
    keywords = JSONField(blank=True, null=True) 
    notes = CharField(max_length=255, blank=True, null=True) 

Когда данные сохранены я получаю очень значимую ошибку: (-1, «ошибка полностью ударяет»). Во всяком случае, она заканчивается в следующем операторе SQL:

UPDATE `products_info_by_kw` SET `brand` = _binary'BINGO!', `keywords` = _binary'[[\\"Tomato\\", \\"Madness\\"]]', `notes` = _binary'' WHERE `products_info_by_kw`.`id` = 48; 

С более или менее ожидаемым результатом:

ERROR 3144 (22032): Cannot create a JSON value from a string with CHARACTER SET 'binary'. 

Brief поиск дал этот результат: https://code.djangoproject.com/ticket/26140, так что, возможно, это то, что нужно делать и мой mysql (или django) неправильно сконфигурирован. Кто-нибудь есть идея, как это исправить?

+0

jango не поддерживает какое-либо поле json изначально в 1.8 и не поддерживает mysql json даже в 1.10 – e4c5

+0

@ e4c5, что вы подразумеваете под «изначально»? Они утверждают, что они это делают, у них есть это поле (http://django-mysql.readthedocs.io/en/latest/model_fields/json_field.html), код (смотрящий в него atm :)). – Pooh

+0

это сторонний плагин. Если это то, что вы используете. обновите свой вопрос, чтобы указать на этот факт. – e4c5

ответ

0

Оказалось, что в префиксе _binary в последнее время произошло некоторое волнение (если не суета) в https://github.com/PyMySQL/mysqlclient-python. Таким образом, версия 1.3.8, на которой я была использована, была затронута этим, в то время как в 1.3.9 это изменение было отменено. Мой код работает сейчас, как и предполагалось.