2012-07-20 7 views
49

Recentemente I went into trouble cercando di utilizzare hstore con Django. Ho installato hstore in questo modo:Come creare un nuovo database con l'estensione hstore già installata?

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

E ingenuamente pensato che i miei nuovi database includessero hstore. Questo non è il 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) 

C'è un modo per avere automaticamente hstore in un database appena creato?

storia

risposta

96

breve:

Installare hstore nel database template1:

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

Step-by-step spiegazione:

Come affermato dal the PostgreSQL documentation :

CREATE EXTENSION carica una nuova estensione nel database corrente.

L'installazione di un'estensione è specifica del database. Di seguito viene riportato il nome del database corrente:

Nel caso in cui si dispone di un database denominato dopo il nome utente. Ora con dbtest:

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

Ok, avete capito. Ora, per creare nuovi database con hstore installato, è necessario installarlo nel database template1. In base a the doc:

CREATE DATABASE funziona in realtà copiando un database esistente. Per impostazione predefinita, copia il database di sistema standard denominato template1.

Facciamo così:

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

e verificare che funziona:

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

Fatto!

+10

+1 per essere corretto e mettere tutto in un formato utile. Si potrebbe considerare di utilizzare un database diverso da 'template1'. Qualsiasi database può servire come modello: 'CREATE DATABASE foo TEMPLATE mytemplate'. Oppure, una volta aggiunti ulteriori elementi in 'template1', puoi usare (vuoto di default)' template0'. –