gpt4 book ai didi

bash - PostgreSQL 数据库如何在两个连续的 shell 命令之间停止存在?

转载 作者:行者123 更新时间:2023-11-29 12:54:55 24 4
gpt4 key购买 nike

我正在尝试在 CI(GitLab CI,如果相关)中创建一个 PostgreSQL 数据库 accounts_db,但前提是该数据库尚不存在。由于 native Postgres 不支持,我目前通过使用 psql 在 pg_database 上运行 SELECT 来解决它,只有当它不返回结果时,我再次使用 psql 来运行 CREATE DATABASE:

psql -tc "SELECT 1 FROM pg_database WHERE datname = 'accounts_db';" | grep -q 1 || psql -c "CREATE DATABASE accounts_db;"

这在大部分时间都有效:accounts_db 已经存在,所以 grep 成功退出并且 CREATE DATABASE 没有被执行。

不过,大多数时候并非总是如此。出于某种原因,它有时会出现在 || 的第二部分,只是因为数据库已经存在而出错:

$ psql -tc "SELECT 1 FROM pg_database WHERE datname = 'accounts_db';" | grep -q 1 || psql -c "CREATE DATABASE accounts_db;"
ERROR: database "accounts_db" already exists

这怎么可能?

最佳答案

顺便说一句:你不需要 grep;您可以使用 psql 的退出代码,只需尝试连接到 数据库:(psql 以非零退出值退出的原因更多;但在那种情况下,第二个 psql 也会失败)

#!/bin/sh

THE_NAME="omg_wtf"

psql -U postgres ${THE_NAME} -tc "select 'yes';" || psql -U postgres postgres -tc "CREATE DATABASE ${THE_NAME} ;"

#Eof

但更简单:只需尝试创建数据库,如果失败则退出脚本:


#!/bin/sh

THE_NAME="omg_wtf"

psql -U postgres postgres -tc "CREATE DATABASE ${THE_NAME} ;"|| exit 1

# you wont get here if the above exited
echo "Created ${THE_NAME}"

#Eof

关于bash - PostgreSQL 数据库如何在两个连续的 shell 命令之间停止存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45713516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com