我正在尝试使用timecaledb扩展程序,因此我正在运行他们的official docker image。
在我的docker入口点文件的最后一行,我运行:
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
我验证它可以在psql中与\dx
一起使用。一旦我尝试使用扩展,我得到:
没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
我发现我必须通过exec
手动添加到psql并运行CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
我的入口点出了什么问题?为什么我必须在构建并运行容器后手动创建扩展?
编辑:这是完整的入口点脚本:
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER test_user PASSWORD 'password123';
ALTER USER test_user WITH SUPERUSER; --needed to create timescaledb extension
CREATE DATABASE testdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE testdb TO test_user;
CREATE DATABASE tsdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE tsdb TO test_user;
ALTER USER test_user CREATEDB;
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
EOSQL
答案 0 :(得分:2)
免责声明:我不知道docker,但这似乎只与Postgres有关,而不是Docker本身
create extension
将创建当前连接到的数据库psql
中的扩展名。看到脚本,这很可能是您连接到的默认数据库postgres
。
因此,扩展程序将在postgres
数据库的<{1}}数据库中创建,不是。
您有两种选择如何更改:
testdb
数据库在template1
数据库中创建的任何内容都将自动在之后创建的每个数据库中创建。因此,如果您在创建测试数据库之前连接到模板数据库并运行template1
,则扩展程序将自动可用:
create extension
请注意,扩展名是在其他任何内容之前创建的。实际的顺序并不重要,唯一重要的是在创建新数据库之前完成。
使用psql -v ON_ERROR_STOP=1 --dbname=template1 --username "$POSTGRES_USER" <<-EOSQL
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
CREATE USER test_user PASSWORD 'password123';
ALTER USER test_user WITH SUPERUSER; --needed to create timescaledb extension
CREATE DATABASE testdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE testdb TO test_user;
CREATE DATABASE tsdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE tsdb TO test_user;
ALTER USER test_user CREATEDB;
EOSQL
psql
命令创建扩展程序之前,从\connect
内切换到新创建的数据库
psql
这两种方法的主要区别在于,首先,扩展将在将来创建的所有数据库中自动使用。而使用第二种方法只能在psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER test_user PASSWORD 'password123';
ALTER USER test_user WITH SUPERUSER; --needed to create timescaledb extension
CREATE DATABASE testdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE testdb TO test_user;
CREATE DATABASE tsdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE tsdb TO test_user;
ALTER USER test_user CREATEDB;
\connect testdb
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
EOSQL
不相关,但是:新创建的用户不需要testdb
权限,因为扩展是使用superuser
用户创建的,而不是新创建的用户。
答案 1 :(得分:2)
要使用先前的答案进行切换,每个数据库都会应用TimescaleDB扩展,因此如果您在没有先使用\c yourdatabase
连接到所需数据库的情况下运行build.sbt
,它会将扩展应用于默认数据库。有关在安装后应用的分步说明,请参阅http://docs.timescale.com/v0.9/getting-started/setup。