2017-01-26 3 views
0

Ich benutze django 1.8.9 und MySQL 5.7.17. Ich habe eine folgende Tabelle:Aktualisierung Mysql JSON Feld

+----------+--------------+------+-----+---------+----------------+ 
| 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 | 
+----------+--------------+------+-----+---------+----------------+ 

In django Ich habe dieses Modell (JSONField von django_mysql ist):

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) 

Wenn die Daten gespeichert ich eine sehr sinnvolle Fehlermeldung erhalten: (-1, "Fehler total whack"). Wie auch immer, es endet in der folgenden SQL-Anweisung auf:

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

Mit dem mehr oder weniger erwartete Ergebnis:

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

Kurz Suche gab dieses Ergebnis: https://code.djangoproject.com/ticket/26140, so vielleicht ist es ein Richtige zu tun und Mein MySQL (oder Django) ist falsch konfiguriert. Hat jemand eine Idee, wie man es reparieren kann?

+0

jango unterstützt keine Art von JSON-Feld nativ in 1.8 und unterstützt nicht mysql Json sogar in 1.10 – e4c5

+0

@ e4c5, was meinst du mit "nativ"? Sie behaupten, sie tun, sie haben dieses Feld (http://django-mysql.readthedocs.io/en/latest/model_fields/json_field.html), der Code (schaut in atm :)). – Pooh

+0

das ist ein Drittanbieter-Plugin. Wenn Sie das verwenden. Aktualisieren Sie Ihre Frage, um diese Tatsache anzuzeigen. – e4c5

Antwort

0

Es stellte sich heraus, dass es in der letzten Zeit um https://github.com/PyMySQL/mysqlclient-python etwas Umwälzung (wenn nicht Aufhebens) um das _binary Präfix gab. Die Version 1.3.8, die ich verwendete, war davon betroffen, während in Version 1.3.9 die Änderung rückgängig gemacht wurde. Mein Code funktioniert jetzt wie vorgesehen.