如何删除匹配模式的postgresql数据库?

时间:2016-07-27 23:40:22

标签: database postgresql pattern-matching

使用pgAdmin III,我可以在postgresql服务器上列出所有数据库。

但是使用pgAdmin,我当时只能删除1个数据库。例如,删除30个数据库需要花费大量时间......

那么,您的删除方法是什么,例如,所有名称中包含“june”一词的数据库?

我可能需要构建一个Bash脚本。没问题。但是你会在这个脚本中使用哪个命令?

我已经在网上搜索了好几个小时而没有成功解决这个问题...

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

psql -c "copy (select datname from pg_database where datname like '%june%') to stdout" | while read line; do
    echo "$line"
    #dropdb -i "$line"
done

或者使用更可靠的for循环(在父上下文中执行while块,因此需要为其主体执行一些额外的移动):

for dbname in $(psql -c "copy (select datname from pg_database where datname like '%june%') to stdout") ; do
    echo "$dbname"
    #dropdb -i "$dbname"
done

-X选项psql(不要使用~/.psqlrc文件)可以避免不必要的输出。

对于psqldropdb实用程序,您可能需要提供连接选项(see documentation

答案 1 :(得分:1)

非常感谢Abelisto。

真的很高兴有他的剧本!

这是我们最后一个运作良好的剧本。绝对棒极了!经过几个月的搜索。

#!/bin/bash
clear
export PGPASSWORD="ssadas"

PATTERN=$1

echo "Le paramètre passé est : $PATTERN"

/usr/bin/psql -U odoo -d postgres -c "copy (select datname from pg_database where datname like '%$PATTERN%') to stdout" | while read line; do
    echo "$line"
    dropdb -U odoo "$line"
done
echo
echo "Les bases de données ayant $PATTERN dans leur nom on été effacées!"
echo
exit

答案 2 :(得分:0)

我认为一种更优雅的方法是使用for循环。

请注意,选项-t-A使psql仅返回数据(没有标题,也没有多余的空格)。这使您可以直接从psql创建bash数组。

# drop all molnet* databases
sql="select datname from pg_database where datname like '%june%'"
dbDelNames=`psql -U postgres -t -A -c "$sql"`
for dbName in ${dbDelNames[@]}
do
    echo -e "\n\n[INFO] Drop $dbName.\n"
    psql -U postgres -c "DROP DATABASE IF EXISTS ${dbName};"
done