2016-03-22 13 views
6

App EngineでDjangoアプリケーションで使用しようとしているCloudSQLインスタンスを設定しました。私はMySQLのCLIに直接接続する場合は、私が正常に挿入し、絵文字を読むことができますAppEngine PythonでCloudSQLでutf8mb4文字セットを使用できません

utf8mb4 utf8mb4_unicode_ci 

:私は、サーバーが私のデータベースのCloudSQLコンソールを介して設定されたutf8mb4文字を使用するように設定されていることが確認されました。ただし、Django管理者から同じ絵文字を挿入すると、「???」というように挿入されます。

私はMySQLdbは-pythonのクライアントはとutf8mb4を使用していることを確認しようとした:

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

しかし、これは、AppEngineの上で、次のエラーが表示されるために私が発生します。

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

私のapp.yamlを使用しています"最新の" MySQLdbライブラリ:

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

解決方法が見つかった場合は、まったく同じ問題です。ありがとう。 –

+0

あなたはこれまでの解決策を見つけましたか?私はMySQLdb(1.2.5)をリモートで接続しようとしましたが、うまくいきました。GAEのlibmysqlclientが古すぎ、本当の問題だと私は信じています。私はあきらめようとしている。 – jturmel

答えて

1

私はちょうどGoogleとチャットしてeverythi私たちのインスタンスのために働いている!

ジャンゴで作業utf8mb4取得するための標準的な方法は、このように、settings.pyで[「OPTIONS」] [「デフォルト」]データベースとして、それを指定するには、次のとおりです。

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

これはAppでOperationalErrorを引き起こしエンジン、MySQLdb 1.2.4b4/1.2.4/1.2.5;明らかに、MySQL CクライアントのGoogleがコンパイルしているのは、utf8mb4文字セットがないということです。

このオプション設定を削除します。

回避策は、手動でSET NAMESを呼び出すことです。編集のlib /ジャンゴ/ DB /バックエンド/ mysqlの/ base.py、それはこのようになりますので、DatabaseWrapper.get_new_connectionにconn.query( "SET NAMES utf8mb4")の行を追加します。

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 

必ずことを確認してくださいまた、バックエンドでutf8mb4が有効になっています。 App Engine Djangoチュートリアルの移行コマンドは、utf8用にCloud SQLインスタンスを設定します。これらのコマンドを実行して、2つのテーブルでutf8mb4を有効にする必要がありました。

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