postgresql - 无法访问在 docker 入口点文件中创建的 postgres 扩展,直到我在 psql 中手动创建它
问题描述
我正在尝试使用 timescaledb 扩展,所以我正在运行他们的官方 docker image。
在我的 docker 入口点文件的最后一行,我运行:
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
我验证它可以\dx
在 psql 中使用。一旦我尝试使用扩展程序,我就会得到:
没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
我发现我必须通过exec
ing 到 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
解决方案
免责声明:我不知道 docker,但这似乎只与 Postgres 有关,与 Docker 本身无关
create extension
psql
将在当前连接的数据库中创建扩展。看到脚本,这很可能是postgres
您连接到的默认数据库。
所以扩展将在postgres
数据库中创建,而不是在testdb
数据库中。
您有两种更改方式的选择:
1.使用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
请注意,扩展是在其他任何内容之前创建的。实际顺序并不那么重要,唯一重要的是它是在创建新数据库之前完成的。
2.连接新创建的数据库
在使用命令 inpsql
创建扩展之前,从内部切换到新创建的数据库\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
权限,因为扩展是使用postgres
用户创建的,而不是新创建的。
推荐阅读
- c# - 有没有办法打开不是模态的文件属性窗口?
- java - SpringBoot - Java AWS SDK 2 DynamoDB 增强客户端和开发工具问题
- latex - LaTeX 中的复杂上标
- django - 如何向所有用户发送电子邮件?
- python - telethon : 下载照片和 AuthKeyError
- haskell - Haskell中的IO类型是什么
- javascript - e.addEventListener 不是函数
- java - 我将如何使用 while 循环来获取多个输入?
- r - 在R中按人给出百分比读取文件的函数
- python - 2个以上类别的Tensorflow神经网络