Jim*_*mmy 116 postgresql shell
我想知道是否有人能够告诉我是否可以使用shell来检查PostgreSQL数据库是否存在?
我正在制作一个shell脚本,我只希望它创建数据库,如果它尚不存在但到目前为止还没有看到如何实现它.
kib*_*ibu 184
我使用以下对Arturo解决方案的修改:
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)
Run Code Online (Sandbox Code Playgroud)
使用朴素方法意味着搜索名为"List"的数据库,"访问"或"行"将成功.因此,我们通过一堆内置命令行工具来管理此输出,仅在第一列中搜索.
该-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
Run Code Online (Sandbox Code Playgroud)
下一位,cut -d \| -f 1通过垂直管道|字符(使用反斜杠从shell转义)拆分输出,并选择字段1.这将离开:
my_db
postgres
template0
template1
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Nat*_*man 68
以下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
Run Code Online (Sandbox Code Playgroud)
Art*_*uro 26
postgres@desktop:~$ psql -l | grep <exact_dbname> | wc -l
Run Code Online (Sandbox Code Playgroud)
如果指定的数据库存在,则返回1,否则返回0.
此外,如果您尝试创建已存在的数据库,postgresql将返回如下错误消息:
postgres@desktop:~$ createdb template1
createdb: database creation failed: ERROR: database "template1" already exists
Run Code Online (Sandbox Code Playgroud)
小智 19
我是postgresql的新手,但以下命令是我用来检查数据库是否存在的命令
if psql ${DB_NAME} -c '\q' 2>&1; then
echo "database ${DB_NAME} exists"
fi
Run Code Online (Sandbox Code Playgroud)
Oth*_*eus 10
我将其他答案与简洁和POSIX兼容的形式结合起来:
psql -lqtA | grep -q "^$DB_NAME|"
Run Code Online (Sandbox Code Playgroud)
返回true(0)表示它存在.
如果您怀疑数据库名称可能具有非标准字符$,则需要稍长的方法:
psql -lqtA | cut -d\| -f1 | grep -qxF "$DB_NAME"
Run Code Online (Sandbox Code Playgroud)
在-t和-A选项确保输出为原料,而不是"表格"或空白填充输出.列由管道字符分离|,因此无论是cut或grep具有识别这个.第一列包含数据库名称.
编辑:使用-x grep以防止部分名称匹配.
您可以使用此方法创建数据库(如果尚不存在):
if [[ -z `psql -Atqc '\list mydatabase' postgres` ]]; then createdb mydatabase; fi
Run Code Online (Sandbox Code Playgroud)
#!/bin/sh
DB_NAME=hahahahahahaha
psql -U postgres ${DB_NAME} --command="SELECT version();" >/dev/null 2>&1
RESULT=$?
echo DATABASE=${DB_NAME} RESULT=${RESULT}
#
Run Code Online (Sandbox Code Playgroud)