2016-03-22 5 views
6

Ustawiłem instancję CloudSQL, której próbuję użyć z moją aplikacją Django w AppEngine. Ustaliliśmy, że serwer jest skonfigurowany do korzystania utf8mb4 zestaw znaków za pomocą konsoli CloudSQL do mojej bazy danych:Nie można użyć zestawu znaków utf8mb4 z CloudSQL na AppEngine Python

utf8mb4 utf8mb4_unicode_ci 

Gdybym połączyć bezpośrednio z CLI mysql, mogę z powodzeniem wkładać i czytać emotikony. Jeśli jednak wstawię te same znaki emoji przez administratora Django, to wstawiane są one jako "???".

starałem się zapewnić klientowi MySQLdb-python korzysta utf8mb4 z:

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

Ale powoduje to mi następujący komunikat o błędzie na AppEngine:

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

Moja app.yaml korzysta "najnowsza" biblioteka MySQLdb:

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

Ten sam dokładny problem, proszę, jeśli znalazłeś rozwiązanie, napisz tutaj. Dzięki. –

+0

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Próbowałem MySQLdb (1.2.5) łącząc się zdalnie i działa dobrze, to prowadzi mnie do przekonania, że ​​libmysqlclient na GAE jest zbyt stary i jest prawdziwym problemem. Już się poddam. – jturmel

Odpowiedz

1

Właśnie rozmawiałem z Google i dostałem wszystko ng pracuje dla naszej instancji!

Standardowy sposób, aby uzyskać utf8mb4 pracy w Django jest określenie go jako domyślnych baz danych [ ''] [ '] opcjami w settings.py, tak:

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

Powoduje to OperationalError w APP Engine, na MySQLdb 1.2.4b4/1.2.4/1.2.5; co najwyraźniej oznacza, że ​​google klienta MySQL C kompiluje się przeciw nie ma zestawu znaków utf8mb4.

Usuń to ustawienie OPCJE.

Obejście problemu polega na ręcznym wywołaniu SET NAMES; edit lib/django/db/backendy/mysql/base.py i dodać conn.query ("Ustaw nazwy utf8mb4") linię do DatabaseWrapper.get_new_connection, więc wygląda to tak:

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 

upewnić się, że również mają włączone utf8mb4 na zapleczu. Polecenia migracji w samouczku App Engine Django skutkują wystąpieniem Cloud SQL skonfigurowanym dla utf8. Potrzebowałem uruchomić te polecenia, aby włączyć utf8mb4 na dwóch tabelach:

ALTER TABLE polls_question CONVERT TO CHARACTER SET utf8mb4; 
ALTER TABLE polls_choice CONVERT TO CHARACTER SET utf8mb4; 
Powiązane problemy