2012-07-20 14 views
49

Ostatnio I went into trouble próbuje użyć hstore z Django. Zainstalowałem hstore ten sposób:Jak utworzyć nową bazę danych z zainstalowanym rozszerzeniem hstore?

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

I naiwnie myślał, że moje nowe bazy danych będzie zawierać hstore. Tak nie jest:

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

Czy istnieje sposób automatycznego posiadania hstore w nowo utworzonej bazie danych?

Odpowiedz

96

Krótko mówiąc:

Install hstore w bazie template1:

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

Krok po kroku wyjaśnienie:

Jak stwierdził the PostgreSQL documentation :

CREATE EXTENSION ładuje nowe rozszerzenie do bieżącej bazy danych.

Instalowanie rozszerzenia jest zależne od bazy danych. Poniższe powrót obecna nazwa bazy danych:

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

W przypadku gdy masz bazę danych o nazwie po swojej nazwy użytkownika. Teraz z dbtest:

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

Ok, masz go. Teraz, aby utworzyć nowe bazy danych z zainstalowanym hstore, będziesz musiał zainstalować go w bazie danych template1. Według the doc:

Tworzenie bazy danych faktycznie działa poprzez kopiowanie istniejącej bazy danych. Domyślnie kopiuje standardową systemową bazę danych o nazwie template1.

Zróbmy to:

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

i sprawdzić, czy to działa:

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

Gotowe!

+10

+1 za poprawność i umieszczenie wszystkiego w przydatnym formacie. Można rozważyć użycie innej bazy danych niż "template1". Każda baza danych może służyć jako szablon: 'CREATE DATABASE foo TEMPLATE mytemplate'. Lub, gdy masz dodatkowe rzeczy w 'template1', możesz użyć (domyślnie puste)' template0'. –

Powiązane problemy