我想知道是否有人能告诉我是否可以使用shell来判断PostgreSQL数据库是否存在?
我正在制作一个shell脚本,我只想让它创建数据库,如果它还不存在,但到目前为止还无法看到如何实现它.
我想知道是否有人能告诉我是否可以使用shell来判断PostgreSQL数据库是否存在?
我正在制作一个shell脚本,我只想让它创建数据库,如果它还不存在,但到目前为止还无法看到如何实现它.
注意/更新(2021):虽然这个答案works,哲学上,我同意其他 comments ,正确的方式来做到这一点是ask Postgres.
判断包含psql -c
或--command
的其他答案是否更适合您的用例(例如Nicholas Grilly's、Nathan Osman's、bruce's或Pedro'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