2016-03-22 10 views
6

Ho creato un'istanza di CloudSQL che sto tentando di utilizzare con la mia app Django su AppEngine. Ho confermato che il server sia impostato per utilizzare utf8mb4 set di caratteri tramite la console CloudSQL per il mio database:Impossibile utilizzare il set di caratteri utf8mb4 con CloudSQL su AppEngine Python

utf8mb4 utf8mb4_unicode_ci 

Se mi collego direttamente con la cli mysql, posso inserire con successo e leggere emoji. Tuttavia, se inserisco gli stessi personaggi delle emoji tramite l'admin di Django, viene inserito come "???".

ho cercato di assicurare il cliente MySQLdb-python utilizza utf8mb4 con:

'ENGINE': 'django.db.backends.mysql', 
... 
'OPTIONS': { 
    'charset': "utf8mb4", 
} 

Ma questo mi fa visualizzato il seguente errore su AppEngine:

(2019, "Can't initialize character set utf8mb4 (path: /usr/local/mysql/share/charsets/)") 

mio app.yaml sta usando la "ultima" libreria MySQLdb:

libraries: 
- name: MySQLdb 
    version: "latest" 
+0

Lo stesso problema esatto, per favore se hai trovato una soluzione scrivilo qui. Grazie. –

+0

Hai mai trovato una soluzione a questo? Ho provato MySQLdb (1.2.5) connettendo in remoto e funziona bene, mi porta a credere che il libmysqlclient su GAE sia troppo vecchio ed è il vero problema. Sto per arrendermi. – jturmel

risposta

1

Ho appena chiacchierato con google e ho ottenuto tutto lavorando per la nostra istanza!

Il metodo standard per ottenere utf8mb4 lavorare in Django è specificare che i database di default [ ''] [ 'OPZIONI'] in settings.py, in questo modo:

'OPTIONS': {'charset': 'utf8mb4'}, 

Questo provoca un OperationalError in App Engine, su MySQLdb 1.2.4b4/1.2.4/1.2.5; che apparentemente significa che il client MySQL C che Google sta compilando non ha il set di caratteri utf8mb4.

Rimuovere questa impostazione OPZIONI.

La soluzione alternativa consiste nel chiamare manualmente i NOMI DI SET; Modifica lib/django/db/backend/mysql/base.py e aggiungere un conn.query ("SET NOMI utf8mb4") la linea in DatabaseWrapper.get_new_connection, in modo che appaia simile al seguente:

def get_new_connection(self, conn_params): 
    conn = Database.connect(**conn_params) 
    conn.encoders[SafeText] = conn.encoders[six.text_type] 
    conn.encoders[SafeBytes] = conn.encoders[bytes] 
    conn.query("SET NAMES utf8mb4") 
    return conn 

Assicurarsi ha anche utf8mb4 abilitato sul backend. I comandi di migrazione nel tutorial di Dj Engine di App Engine danno come risultato un'istanza di Cloud SQL configurata per utf8. Avevo bisogno di eseguire questi comandi per abilitare utf8mb4 sulle due tabelle:

ALTER TABLE polls_question CONVERT TO CHARACTER SET utf8mb4; 
ALTER TABLE polls_choice CONVERT TO CHARACTER SET utf8mb4;