60

最近我在尝试将 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 ?

4

2 回答 2

115

长话短说:

在 template1 数据库中安装 hstore:

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)

完毕!

于 2012-07-20T18:10:23.707 回答
0

还要记住,hstore 在 Public 模式中,所以如果你使用其他模式,你应该使用格式 public.hstore(record)

于 2020-07-31T11:27:48.597 回答