Как создать новую базу данных с уже установленным расширением hstore?

Недавно у меня возникли проблемы при попытке использовать hstore с Django. Я установил 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)

И наивно думал, что мои новые базы данных будут включать в себя hstore. Это не так:

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

Есть ли способ автоматически иметь hstore во вновь созданной базе данных?


person Maxime R.    schedule 20.07.2012    source источник


Ответы (2)


Короче говоря:

Установите hstore в базу данных template1:

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

Пошаговое объяснение:

Как указано в документации PostgreSQL:

CREATE EXTENSION загружает новое расширение в текущую базу данных.

Установка расширения зависит от базы данных. Следующее возвращает вам текущее имя базы данных:

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

Если у вас есть база данных, названная в честь вашего имени пользователя. Теперь с dbtest:

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

Хорошо, вы поняли. Теперь, чтобы создать новые базы данных с установленным hstore, вам нужно установить его в базу данных template1. Согласно документу:

CREATE DATABASE на самом деле работает путем копирования существующей базы данных. По умолчанию он копирует стандартную системную базу данных с именем template1.

Давай сделаем это:

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

И проверьте, что это работает:

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

Сделанный!

person Maxime R.    schedule 20.07.2012
comment
+1 за правильность и представление всего этого в удобном формате. Можно рассмотреть возможность использования базы данных, отличной от template1. Шаблоном может служить любая база данных: CREATE DATABASE foo TEMPLATE mytemplate. Или, если у вас есть дополнительные материалы в template1, вы можете использовать (пустой по умолчанию) template0. - person Erwin Brandstetter; 20.07.2012

Также помните, что hstore находится в общедоступной схеме, поэтому, если вы используете другие схемы, вы должны использовать формат public.hstore(record)

person Tomasz Konopiński    schedule 31.07.2020