5

我有一个 Postgres 安装,它设置为使用 LATIN1 作为默认编码。但是,我的生产数据库要求我使用 UTF8(它托管在 Heroku 上,所以我没有任何选择)。

我已经创建了本地开发数据库以正确设置此设置:

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

但是,我现在无法运行 django 测试,因为测试数据库只使用默认的 Postgres 集群设置 (LATIN1),这会导致测试失败(我在某些模板中有无效字符 - ...character 0xe28099 of encoding "UTF8" has no equivalent in "LATIN1"

“核”选项是使用正确的 (en_US.UTF8) 设置重新安装 Postgres,但是由于我在 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 配置脚本(shell 脚本)中使用正确的排序规则重新创建 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

0

在 settings.py 底部添加此代码

try:
    from local_settings import *
except ImportError:
    pass

在 local_settings.py 中添加此代码

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test_db',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '3306',
        'OPTIONS': {
                    'charset': 'latin1',
                    'use_unicode': True, },
    }, 
}

将 local_settings.py 添加到 git ignore。

于 2013-06-21T09:40:34.030 回答