2016-03-22 10 views
6

'da CloudSQL ile utf8mb4 karakter kümesi kullanılamıyor AppEngine'deki Django uygulamam ile kullanmaya çalıştığım bir CloudSQL örneği oluşturdum.AppEngine Python

utf8mb4 utf8mb4_unicode_ci 

Ben mysql cli doğrudan bağlantı, ben başarıyla takıp okuyabilir emojileri: sunucu benim veritabanı için CloudSQL konsolu üzerinden set utf8mb4 karakter kullanmak üzere ayarlanmış teyit ediyoruz. Ancak, aynı emoji karakterlerini Django admin üzerinden eklersem sadece "???" Olarak eklenir.

Ben MySQLdb-piton istemci ile utf8mb4 kullanıyor olmasına gayret:

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

Ama bu AppEngine'de aşağıdaki hatayı almaya beni neden olur:

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

Benim app.yaml kullanıyor "en son" MySQLdb kitaplığı:

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

Aynı sorun, lütfen bir çözüm bulursanız buraya yazın. Teşekkürler. –

+0

Buna bir çözüm buldunuz mu? MySQLdb'yi (1.2.5) uzaktan bağlamayı denedim ve iyi çalışıyor, GAE'deki libmysqlclient'in çok eski olduğuna ve gerçek sorun olduğuna inanmamı sağlıyor. Pes etmek üzereyim. – jturmel

cevap

1

Sadece google ile sohbet ettim ve her şeyi aldım bizim örneğimiz için çalışıyoruz!

standart yol Django çalışan utf8mb4 almak için bu gibi settings.py içinde DATABASES [ 'default'] [ 'SEÇEN'] olarak belirtmektir:

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

Bu App bir OperationalError neden olur Motor, MySQLdb 1.2.4b4/1.2.4/1.2.5 üzerinde; görünüşe göre, MySQL C istemcisinin google'ı derlemesi, utf8mb4 karakter kümesinin eksik olduğunu gösteriyor.

Bu OPTIONS ayarını kaldırın.

Çözüm, ADIM ADIMLARINI manuel olarak aramaktır; düzenlemek lib/Django/db/arka uçları/mysql/base.py ve şuna benzer şekilde, DatabaseWrapper.get_new_connection içine ("İSİMLERİ utf8mb4 SET") satırını bir conn.query ekleyin:

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 

emin olun sen misin Ayrıca arka ucunda utf8mb4 etkin. App Engine Django öğreticisindeki taşıma komutları, utf8 için yapılandırılmış bir Cloud SQL örneğiyle sonuçlanır. İki tablodaki utf8mb4'ü etkinleştirmek için bu komutları çalıştırmam gerekiyordu:

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