5

デフォルトのエンコーディングとして LATIN1 を使用するように設定された Postgres インストールがあります。ただし、本番データベースでは UTF8 を使用する必要があります (Heroku でホストされているため、これには選択の余地がありません)。

これを正しく設定するために、ローカル dev データベースを作成しました。

sudo createdb -Upostgres $PROJECT_NAME --template=template0 \
    --encoding=UTF8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8

ただし、テスト データベースはデフォルトの Postgres クラスター設定 (LATIN1) を使用するだけでテストが失敗するため、django テストを実行できません (一部のテンプレートに無効な文字があります - ...character 0xe28099 of encoding "UTF8" has no equivalent in "LATIN1") 。

「nuclear」オプションは、Postgres を正しい (en_US.UTF8) 設定で再インストールすることですが、これを VM で実行しているため、VM を起動するたびにこれを行う必要はありません。そもそも Django をマッサージしてデータベースを正しく作成する方法があれば、それが望ましいでしょう。

[更新 1: TEST_ENCODING]

@sneawo の提案に従って、データベースの TEST_ENCODING 属性を設定したところ、次のエラーが発生しました。

Creating test database for alias 'default'...
Got an error creating the test database: encoding UTF8 does not match locale en_US
DETAIL:  The chosen LC_CTYPE setting requires encoding LATIN1.

[更新 2: 核オプション]

上記でこれを参照しましたが、万人向けではありませんが、これを VM で実行しているので、Vagrant プロビジョニング スクリプト (シェル スクリプト) で正しい照合を使用して postgres クラスターを再作成するのは実際には非常に簡単です。

sudo service postgresql stop
sudo pg_dropcluster 9.1 --stop main
sudo pg_createcluster --start -e UTF-8 9.1 main
sudo cp -f $CONF_DIR/pg_hba.conf /etc/postgresql/9.1/main/pg_hba.conf
sudo cp -f $CONF_DIR/postgresql.conf /etc/postgresql/9.1/main/postgresql.conf
sudo service postgresql restart

のデフォルトの「すべてを許可する」バージョンがpg_hba.confあり、postgresql.confそれをホスト マシンからコピーして、クラスタの作成時に作成されたデフォルトを上書きします。これは大ハンマーで簡単に解決できる方法ですが、機能し、迅速です。

4

1 に答える 1