【问题标题】:Postgres CREATE EXTENSION All DatabasesPostgres CREATE EXTENSION 所有数据库
【发布时间】:2022-04-08 12:04:30
【问题描述】:

我已经在多个环境中安装了 postgres。在每种环境中,我都有 2 个以上的数据库。

如果我有超级用户数据库权限,有没有办法在给定的 postgres 安装上为所有数据库安装 CITEXT 扩展?

到目前为止,一旦登录到环境和 postgres 控制台,我必须为每个数据库运行 CREATE EXTENSION IF NOT EXISTS citext;

【问题讨论】:

  • 您必须分别针对每个数据库运行它。您可以做的是编写一个 bash 循环来针对所有数据库运行它

标签: database postgresql


【解决方案1】:

CREATE 命令确实需要在每个数据库上单独运行,但您可以使用 shell 脚本轻松地自动执行此操作,例如:

for DB in $(psql -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1')"); do
  psql -d $DB -c "CREATE EXTENSION IF NOT EXISTS citext"
done

如果您希望在创建新数据库时默认包含citext,您也可以在template1 中安装扩展。

【讨论】:

  • 很高兴您能包含真实的示例脚本示例。
  • 如何在不使用psql的情况下做同样的事情?
  • @Madeo:与任何其他客户端相同,即连接到"postgres" 数据库,运行SELECT datname 查询以获取所有其他数据库的列表,然后连接到每个数据库在列表中运行您的CREATE EXTENSION
  • @NickBarnes 我在 Docker 中使用 initdb 脚本,我只能运行 .sql 文件。
  • @Madeo:如果您只能运行纯 SQL 脚本,那么您只能在您连接的数据库中创建扩展。但是docs 包含一个调用psql 的initdb .sh 脚本的示例,所以看起来这应该可以工作。
【解决方案2】:
#!/bin/bash
export PGPASSWORD='Xyz123';
for DB in $(psql -h localhost -U postgres -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1')"); do

  psql -U postgres -d $DB -c "CREATE EXTENSION IF NOT EXISTS pg_buffercache"
done

The script is only working for last database and for remaining dbs i am getting this error
**" **does not existAL:  database "debdbi123****. Please help on fixing the issue


++ psql -h localhost -U postgres -t -c 'SELECT datname FROM pg_database WHERE datname NOT IN ('\''postgres'\'', '\''template0'\'', '\''template1'\'')'
+ for DB in $(psql -h localhost -U postgres -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1')")
+ psql -U postgres -d $'debdbi123\r' -c 'CREATE EXTENSION IF NOT EXISTS pg_buffercache'
**" **does not existAL:  database "debdbi123****
+ for DB in $(psql -h localhost -U postgres -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1')")
+ psql -U postgres -d 1 -c 'CREATE EXTENSION IF NOT EXISTS pg_buffercache'
NOTICE:  extension "pg_buffercache" already exists, skipping
-- 

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2012-12-25
  • 2018-06-25
  • 2018-09-08
  • 2021-05-16
  • 1970-01-01
  • 2011-02-19
  • 2011-08-12
  • 2012-05-22
  • 1970-01-01
相关资源
最近更新 更多