2012-07-20 11 views
49

Recientemente I went into trouble tratando de usar hstore con Django. Instalé hstore de esta manera:¿Cómo crear una nueva base de datos con la extensión hstore ya instalada?

$ 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) 

Y ingenuamente pensé que mis nuevas bases de datos incluirían hstore. Ese no es el caso:

$ 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) 

¿Hay alguna manera de tener automáticamente hstore en una base de datos recién creada?

Respuesta

96

Para resumir:

Instalar hstore en la base de datos template1:

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

Paso a paso explicación:

Como señaló the PostgreSQL documentation :

CREAR EXTENSIÓN carga una nueva extensión en la base de datos actual.

La instalación de una extensión es específica de la base de datos. Los siguientes le devuelve el nombre de base de datos actual:

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

en caso de tener una base de datos el nombre de su nombre de usuario. Ahora con dbtest:

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

Ok, lo tienes. Ahora, para crear nuevas bases de datos con hstore instalado, deberá instalarlo en la base de datos template1. De acuerdo con the doc:

CREATE DATABASE en realidad funciona copiando una base de datos existente. Por defecto, copia la base de datos del sistema estándar llamada template1.

Vamos a hacer esto:

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

y comprobar que funciona:

$ 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) 

hecho!

+10

+1 por ser correcto y ponerlo todo en un formato útil. Uno podría considerar usar una base de datos diferente a 'template1'. Cualquier base de datos puede servir como plantilla: 'CREATE DATABASE foo TEMPLATE mytemplate'. O bien, una vez que tenga elementos adicionales en 'template1', puede usar la plantilla (vacía por defecto)' template0'. –

Cuestiones relacionadas