我想知道是否有人能告诉我是否可以使用shell来判断PostgreSQL数据库是否存在?

我正在制作一个shell脚本,我只想让它创建数据库,如果它还不存在,但到目前为止还无法看到如何实现它.

推荐答案

注意/更新(2021):虽然这个答案works,哲学上,我同意其他 comments ,正确的方式来做到这一点是ask Postgres.

判断包含psql -c--command的其他答案是否更适合您的用例(例如Nicholas Grilly'sNathan Osman'sbruce'sPedro's variant)


我对阿图罗的解决方案进行了以下修改:

psql -lqt | cut -d \| -f 1 | grep -qw <db_name>


它的作用

psql -l个输出,如下所示:

                                        List of databases
     Name  |   Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+-----------+----------+------------+------------+-----------------------
 my_db     | my_user   | UTF8     | en_US.UTF8 | en_US.UTF8 | 
 postgres  | postgres  | LATIN1   | en_US      | en_US      | 
 template0 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
 template1 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
(4 rows)

使用朴素的方法意味着搜索名为"List"、"Access"或"rows"的数据库将成功.因此,我们通过一系列内置的命令行工具将此输出传输到只搜索第一列.


-t标志删除页眉和页脚:

 my_db     | my_user   | UTF8     | en_US.UTF8 | en_US.UTF8 | 
 postgres  | postgres  | LATIN1   | en_US      | en_US      | 
 template0 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres
 template1 | postgres  | LATIN1   | en_US      | en_US      | =c/postgres          +
           |           |          |            |            | postgres=CTc/postgres

下一位cut -d \| -f 1按垂直管道|字符(用反斜杠从shell 转义)拆分输出,并 Select 字段1.这就剩下:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w匹配整个单词,因此如果在本场景中搜索temp,则不匹配.-q选项会 suppress 写入屏幕的任何输出,因此如果您想在命令提示下以交互方式运行该选项,可以使用排除-q选项,以便立即显示某些内容.

请注意,grep -w匹配字母数字、数字和下划线,这正是postgresql中不带引号的数据库名称所允许的字符集(连字符在不带引号的标识符中不合法).如果你使用的是其他字符,grep -w对你来说不合适.


如果数据库存在,则整个管道的退出状态将为0(成功),如果数据库不存在,则为1(失败).shell会将特殊变量$?设置为最后一个命令的退出状态.您还可以直接在条件中测试状态:

if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
    # database exists
    # $? is 0
else
    # ruh-roh
    # $? is 1
fi

Postgresql相关问答推荐

Postgres:创建分区需要很长时间

Postgres 11没有强制执行外键约束?

IF 块中的 CREATE FUNCTION 语句抛出错误,同时运行它自己的作品

这个 Supbase 查询在 SQL ( Postgresql ) 中的类似功能是什么

从dump文件中恢复三张表遇到的问题

如何包装 record_out() 函数?

Postgres 唯一 JSON 数组聚合值

转换数组类型

我可以使用 Rails 将数组存储在 hstore 中吗

运算符不存在:integer = integer[] 在使用 ANY 的查询中

如何从 WSL 连接到 windows postgres 数据库

如何在可选参数上查询 postgres?

Rails 4查询由单个属性唯一

返回 NULL 的空数组的 array_length()

在 row_to_json 函数中 Select 查询

在 PostgreSQL 数组中查找值的位置

如何使用 psql 执行 *.sql 文件

将 Windows 上的 .sql 文件导入到 postgresql

安装了 Postgres.app 但它不起作用

学习 PL/pgSQL 的好资源?