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

11

通过pgAdmin III,我可以列出PostgreSQL服务器上的所有数据库。

但是在pgAdmin中,我每次只能删除一个数据库。要删除30个数据库就需要一次次地删除,非常耗时。

那么,如果我想删除所有名称中包含“june”单词的数据库,你会怎么做?

也许我需要编写一个Bash脚本来处理这个问题。这也不是问题。但是在该脚本中,你会使用哪个命令?

我在网上搜索了很多小时,但没有找到解决方案……

感谢您的帮助。

4个回答

11
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工具,您可能需要提供连接选项(请查看文档)。


适用于psql 12的无需确认即可运行的代码:for dbname in $(psql -c "copy (select datname from pg_database where datname like 'test%') to stdout"); do echo "$dbname"; dropdb "$dbname"; done; - Cees Timmerman

1

非常感谢Abelisto

以下是我们经过多个月的搜索后得到的最终脚本,目前运行良好。

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

PATTERN=$1

echo "Pattern parameter: $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 xxxx "$line"
done
echo
echo "Databases which names matches pattern $PATTERN were deleted!"
echo
exit

1

有很多好的、强大的解决方案;但这里有一个bash单行命令,可以保存在老魔法书中:

psql -Atqc "SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datname like '%june%';" | psql

这里使用了一个 SELECT 语句,它在对 pg_database 表进行查询时,围绕返回的 datname 构建了一些字符串。

SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' 
FROM pg_database WHERE datname like '%june%';

这是通过在shell中使用psql参数直接执行的:

-A 打印表元素时关闭填充对齐功能。

-t 关闭打印列名和结果行计数。这对于与shell脚本中的-c选项一起使用很有用。

-q 指定psql应安静地工作。默认情况下,它会打印欢迎和退出消息,并提示每个查询。如果使用此选项,则不会发生任何这些情况。这对于使用-c选项很有用。

-c query 指定psql要执行一个查询字符串、查询,然后退出。这对于shell脚本特别是与shell脚本中的-q选项一起使用时很有用。

然后将所有这些管道传递到另一个调用psql中,并使用| psql执行DROP DATABASE查询。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接