J'ai installé postgresql-9.2.4
de la source, maintenant dans Rails app lorsque j'exécute:
rake db:create
commande je reçois:
$ bin/rake db:create Rails_ENV="test"
PG::Error: ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
HINT: Use the same encoding as in the template database, or use template0 as template.
: CREATE DATABASE "verticals_test" ENCODING = 'unicode'
/home/vagrant/my-project/.gems/Ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:652:in `exec
....
bin/rake:16:in `load'
bin/rake:16:in `<main>'
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"my_db", "Host"=>"localhost", "pool"=>5, "username"=>"my_user", "password"=>"my_password"}
une idée?
Ok, ci-dessous les étapes ont résolu le problème:
Tout d'abord, nous devons supprimer template1. Les modèles ne peuvent pas être supprimés, nous allons donc d'abord le modifier pour qu'il soit une base de données ordinaire:
UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
Maintenant nous pouvons le laisser tomber:
DROP DATABASE template1;
Il est maintenant temps de créer une base de données à partir de template0, avec un nouveau codage par défaut:
CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';
Maintenant modifiez template1 pour qu’il s’agisse d’un modèle:
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
Passez maintenant à template1 et VACUUM FREEZE le template:
\c template1
VACUUM FREEZE;
Le problème devrait être résolu.
Assurez-vous que la configuration est correcte dans votre database.yml
fichier. Tu devrais utiliser template0
, comme le suggère l'erreur:
test:
adapter: postgresql
encoding: unicode
database: your_db_name
template: template0
Host: localhost
...
Si vous utilisez Debian, lorsque vous installez le paquet postgresql, il utilisera vos paramètres régionaux par défaut pour créer la base de données template1. Si vous n'avez pas configuré votre système d'exploitation pour utiliser UTF-8 comme paramètres régionaux par défaut, vous rencontrerez cette erreur.
Outre les solutions ci-dessus, si vous êtes sur une nouvelle installation et que vous ne possédez aucune base de données active, vous pouvez supprimer le package postgresql et définir vos paramètres régionaux par défaut sur UTF-8. L'avantage de cette méthode est que vous pouvez omettre les informations sur les paramètres régionaux lors de la création de bases de données.
dpkg-reconfigure locales
Si vous ne voyez pas les paramètres régionaux souhaités, installez le paquet locales-all.
apt-get install locales-all
Puis supprimez postgresql
apt-get remove --purge postgresql-<version>
Ensuite, réinstallez ou mieux mise à niveau vers une version récente non stable dans Debian .
Quant à moi, je viens de changer la ligne de database.yml
:
encoding: unicode
à:
encoding: SQL_ASCII
rien que ça et tout fonctionne.
Si votre installation postgres est nouvelle et que vous n'avez pas encore rempli de base de données, vous pouvez alors supprimer votre répertoire data
et réexécuter la commande initdb avec l'indicateur pour créer des bases de données à l'aide de UTF-8.
Modifiez cette commande pour qu'elle corresponde à votre installation postgres. Le -E
flag indique quel codage de caractères doit être le codage par défaut. D'autres encodages de caractères sont listés ici .
/usr/local/pgsql/bin/initdb -E UTF8 -D /usr/local/pgsql/data -U postgres
Il devrait contenir une erreur et vous dire que le répertoire data
n'est pas vide. Suivez les instructions et supprimez le répertoire, puis réexécutez la commande. (Ou supprimez le répertoire data
avant de commencer, mais il est toujours agréable de voir les instructions par vous-même.)
J'ai eu un problème similaire. Mon database.yml était comme ça: -
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("Rails_MAX_THREADS") { 5 } %>
development:
<<: *default
database: chatapp_development
test:
<<: *default
database: chatapp_test
production:
<<: *default
database: chatapp_production
username: chatapp
password: <%= ENV['CHATAPP_DATABASE_PASSWORD'] %>
J'ai ajouté template: template0 aux paramètres par défaut
default: &default
adapter: postgresql
template: template0
encoding: unicode
pool: <%= ENV.fetch("Rails_MAX_THREADS") { 5 } %>
Et ça a fonctionné