检查数据库使用shell中存在的PostgreSQL(Check if database exist

2019-07-18 19:01发布

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

我想提出一个shell脚本,我只希望它,如果它不存在创建数据库,但到现在一直没能看到如何实现它。

Answer 1:

我使用阿图罗解决方案的以下修改:

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)

使用天真的方法意味着寻找一个叫“列表中,‘访问’或‘行数据库’将取得成功。因此,我们管这个输出经过一堆内置的命令行工具仅在第一列中进行搜索。


-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 cut -d \| -f 1由垂直管拆分输出| 字符(从用反斜杠外壳逸出),并且选择字段1.本叶:

 my_db             
 postgres          
 template0         

 template1         

grep -w如果您正在寻找匹配整个单词,所以将不匹配temp在这种情况下。 该-q选项禁止输出到屏幕的任何输出,所以如果你想在命令提示符下交互运行这可能与排除-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


Answer 2:

下面的shell代码似乎为我工作:

if [ "$( psql -tAc "SELECT 1 FROM pg_database WHERE datname='DB_NAME'" )" = '1' ]
then
    echo "Database already exists"
else
    echo "Database does not exist"
fi


Answer 3:

postgres@desktop:~$ psql -l | grep <exact_dbname> | wc -l

如果指定的数据库存在,否则为0这将返回1。

此外,如果您尝试创建一个已经存在的数据库,PostgreSQL将返回这样的错误信息:

postgres@desktop:~$ createdb template1
createdb: database creation failed: ERROR:  database "template1" already exists


Answer 4:

我是新来的Pos​​tgreSQL,但下面的命令是我用来检查一个数据库存在

if psql ${DB_NAME} -c '\q' 2>&1; then
   echo "database ${DB_NAME} exists"
fi


Answer 5:

我结合其他的答案,以简洁和POSIX兼容格式:

psql -lqtA | grep -q "^$DB_NAME|"

的返回true0 )意味着它的存在。

如果你怀疑你的数据库名称可能有一个非标准的字符,如$ ,你需要稍长的方法:

psql -lqtA | cut -d\| -f1 | grep -qxF "$DB_NAME"

-t-A选项可确保输出为原料,而不是“表格”或空白填充输出。 列由竖线分隔| ,因此无论是cutgrep必须认识到这一点。 第一列包含数据库名称。

编辑:grep的使用-x防止部分名称相匹配。



Answer 6:

你可以创建一个数据库,如果它不存在,使用这种方法:

if [[ -z `psql -Atqc '\list mydatabase' postgres` ]]; then createdb mydatabase; fi


Answer 7:

#!/bin/sh
DB_NAME=hahahahahahaha
psql -U postgres ${DB_NAME} --command="SELECT version();" >/dev/null 2>&1
RESULT=$?
echo DATABASE=${DB_NAME} RESULT=${RESULT}
#


Answer 8:

为了完整起见,另一个版本使用正则表达式,而不是字符串切割:

psql -l | grep '^ exact_dbname\b'

因此,举例来说:

if psql -l | grep '^ mydatabase\b' > /dev/null ; then
  echo "Database exists already."
  exit
fi


Answer 9:

kibibu的接受的答案是在有缺陷grep -w将匹配包含指定模式的词组成的任何名称。

也就是说,如果你寻找“富”,那么“富备份”匹配。

Otheus的答案提供了一些良好的改善,以及短版将正常工作在大多数情况下,但提供的展品与匹配的子类似的问题,这两个变种的更长。

要解决这个问题,我们可以使用POSIX -x参数匹配的文本只行。

在Otheus的答案的基础上,新的版本是这样的:

psql -U "$USER" -lqtA | cut -d\| -f1 | grep -qFx "$DBNAME"

这一切都表示,我倾向于说, 萨科格里利的答案 -在这里你居然问一下具体的Postgres数据库-是所有的最好的办法。



Answer 10:

我还是用shell编程经验的漂亮,所以如果这是真的错了因为某些原因,投我失望,但不要过于惊慌。

从kibibu的答案建设:

# If resulting string is not zero-length (not empty) then...
if [[ ! -z `psql -lqt | cut -d \| -f 1 | grep -w $DB_NAME` ]]; then
  echo "Database $DB_NAME exists."
else
  echo "No existing databases are named $DB_NAME."
fi


Answer 11:

psql -l|awk '{print $1}'|grep -w <database>

短版



Answer 12:

其他解决方案(这是梦幻般的)错过了事实PSQL可以超时前等待一分钟以上,如果它不能连接到主机。 所以,我喜欢这样的解决方案,这将超时时间设置为3秒:

PGCONNECT_TIMEOUT=3 psql development -h db -U postgres -c ""

这是用于连接到开发数据库的正式的Postgres阿尔卑斯山码头工人的形象。

另外,如果你使用Rails和希望建立一个数据库,如果它不存在(推出泊坞容器时),这个效果很好,因为迁移是幂:

bundle exec rake db:migrate 2>/dev/null || bundle exec rake db:setup


文章来源: Check if database exists in PostgreSQL using shell