我想知道是否有人能告诉我是否有可能使用shell来检查PostgreSQL数据库存在?
我想提出一个shell脚本,我只希望它,如果它不存在创建数据库,但到现在一直没能看到如何实现它。
我想知道是否有人能告诉我是否有可能使用shell来检查PostgreSQL数据库存在?
我想提出一个shell脚本,我只希望它,如果它不存在创建数据库,但到现在一直没能看到如何实现它。
我使用阿图罗解决方案的以下修改:
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
下面的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
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
我是新来的PostgreSQL,但下面的命令是我用来检查一个数据库存在
if psql ${DB_NAME} -c '\q' 2>&1; then
echo "database ${DB_NAME} exists"
fi
我结合其他的答案,以简洁和POSIX兼容格式:
psql -lqtA | grep -q "^$DB_NAME|"
的返回true
( 0
)意味着它的存在。
如果你怀疑你的数据库名称可能有一个非标准的字符,如$
,你需要稍长的方法:
psql -lqtA | cut -d\| -f1 | grep -qxF "$DB_NAME"
该-t
和-A
选项可确保输出为原料,而不是“表格”或空白填充输出。 列由竖线分隔|
,因此无论是cut
或grep
必须认识到这一点。 第一列包含数据库名称。
编辑:grep的使用-x防止部分名称相匹配。
你可以创建一个数据库,如果它不存在,使用这种方法:
if [[ -z `psql -Atqc '\list mydatabase' postgres` ]]; then createdb mydatabase; fi
#!/bin/sh
DB_NAME=hahahahahahaha
psql -U postgres ${DB_NAME} --command="SELECT version();" >/dev/null 2>&1
RESULT=$?
echo DATABASE=${DB_NAME} RESULT=${RESULT}
#
为了完整起见,另一个版本使用正则表达式,而不是字符串切割:
psql -l | grep '^ exact_dbname\b'
因此,举例来说:
if psql -l | grep '^ mydatabase\b' > /dev/null ; then
echo "Database exists already."
exit
fi
kibibu的接受的答案是在有缺陷grep -w
将匹配包含指定模式的词组成的任何名称。
也就是说,如果你寻找“富”,那么“富备份”匹配。
Otheus的答案提供了一些良好的改善,以及短版将正常工作在大多数情况下,但提供的展品与匹配的子类似的问题,这两个变种的更长。
要解决这个问题,我们可以使用POSIX -x
参数匹配的文本只整行。
在Otheus的答案的基础上,新的版本是这样的:
psql -U "$USER" -lqtA | cut -d\| -f1 | grep -qFx "$DBNAME"
这一切都表示,我倾向于说, 萨科格里利的答案 -在这里你居然问一下具体的Postgres数据库-是所有的最好的办法。
我还是用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
psql -l|awk '{print $1}'|grep -w <database>
短版
其他解决方案(这是梦幻般的)错过了事实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