2016-03-22 7 views
6

Ich habe eine CloudSQL-Instanz eingerichtet, die ich mit meiner Django-App auf AppEngine verwenden möchte. Ich habe bestätigt, dass der Server gesetzt utf8mb4 Zeichen über die CloudSQL Konsole für meine Datenbank-Set zu verwenden:Konnte den utf8mb4-Zeichensatz nicht mit CloudSQL auf AppEngine Python verwenden

utf8mb4 utf8mb4_unicode_ci 

Wenn ich direkt mit dem mysql cli verbinden, kann ich erfolgreich einsetzen und lesen Emojis. Wenn ich jedoch dieselben Emoji-Zeichen über den Django-Administrator einfüge, wird es einfach als "????" Eingefügt.

habe ich versucht, die MySQLdb-Python-Client verwendet utf8mb4 mit zu gewährleisten:

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

Aber das macht mir die folgende Fehlermeldung auf App Engine erhalten:

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

Mein app.yaml ist mit die "neueste" MySQLdb-Bibliothek:

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

Genaues Problem, bitte, wenn Sie eine Lösung gefunden haben, schreiben Sie es hier. Vielen Dank. –

+0

Haben Sie jemals eine Lösung gefunden? Ich habe versucht, MySQLdb (1.2.5) Remote-Verbindung und es funktioniert gut, es führt zu der Überzeugung, dass der libmysqlclient auf GAE zu alt ist und das eigentliche Problem ist. Ich gebe gerade auf. – jturmel

Antwort

1

Ich plauderte nur mit Google und bekam everythi ng für unsere Instanz arbeiten!

Der übliche Weg in Django zu bekommen utf8mb4 Arbeit ist es, als DATABASES angeben [ 'default'] [ 'OPTIONS'] in settings.py, wie folgt aus:

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

Dies führt zu einer OperationalError in App Engine, auf MySQLdb 1.2.4b4/1.2.4/1.2.5; was scheinbar bedeutet, dass der MySQL-C-Client, gegen den google kompiliert wird, den utf8mb4-Zeichensatz vermisst.

Entfernen Sie diese OPTIONS-Einstellung.

Die Problemumgehung besteht darin, SET NAMES manuell aufzurufen; bearbeiten lib/django/db/backends/mysql/base.py und conn.query hinzufügen ("SET NAMES utf8mb4") Linie in DatabaseWrapper.get_new_connection, so dass es wie folgt aussieht:

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 

Vergewissern Sie sich, dass Sie habe auch utf8mb4 im Backend aktiviert. Die Migrationsbefehle im App Engine Django-Lernprogramm führen zu einer Cloud-SQL-Instanz, die für utf8 konfiguriert ist. Ich musste diese Befehle ausführen, um utf8mb4 für die beiden Tabellen zu aktivieren:

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