web-dev-qa-db-fra.com

Comment créer une nouvelle base de données avec l'extension hstore déjà installée?

Récemment j'ai eu des ennuis en essayant d'utiliser hstore avec Django. J'ai installé hstore de cette façon:

$ Sudo -u postgres psql
postgres=# CREATE EXTENSION hstore;
WARNING:  => is deprecated as an operator name
DETAIL:  This name may be disallowed altogether in future versions of PostgreSQL.
CREATE EXTENSION
postgres=# \dx
                           List of installed extensions
  Name   | Version |   Schema   |                   Description                    
---------+---------+------------+--------------------------------------------------
 hstore  | 1.0     | public     | data type for storing sets of (key, value) pairs
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

Et j'ai naïvement pensé que mes nouvelles bases de données incluraient hstore. Ce n'est pas le cas:

$ createdb dbtest
$ psql -d dbtest -c '\dx'
                 List of installed extensions
  Name   | Version |   Schema   |         Description          
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

Existe-t-il un moyen d'avoir automatiquement hstore dans une base de données nouvellement créée?

53
Maxime R.

Bref:

Installez hstore dans la base de données template1:

psql -d template1 -c 'create extension hstore;'

Explication étape par étape:

Comme indiqué par la documentation PostgreSQL :

CREATE EXTENSION charge une nouvelle extension dans la base de données actuelle.

L'installation d'une extension est spécifique à la base de données. Ce qui suit vous renvoie le nom de la base de données actuelle:

$ psql -c 'select current_database()'
 current_database 
------------------
 username
(1 row)

Dans le cas où vous avez une base de données nommée d'après votre nom d'utilisateur. Maintenant avec dbtest:

$ psql -d dbtest -c 'select current_database()'
 current_database 
------------------
 dbtest
(1 row)

Ok, tu l'as. Maintenant, pour créer de nouvelles bases de données avec hstore installé, vous devrez l'installer dans le template1 base de données. Selon le doc :

CREATE DATABASE fonctionne réellement en copiant une base de données existante. Par défaut, il copie la base de données système standard nommée template1.

Faisons cela:

$ psql -d template1 -c 'create extension hstore;'

Et vérifiez que cela fonctionne:

$ createdb dbtest
$ psql -d dbtest -c '\dx'
                 List of installed extensions
  Name   | Version |   Schema   |                   Description                    
---------+---------+------------+--------------------------------------------------
 hstore  | 1.0     | public     | data type for storing sets of (key, value) pairs
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

Terminé!

107
Maxime R.