使用bash脚本删除postgresql中的所有表

时间:2011-10-14 09:04:47

标签: bash postgresql

我是新手bash脚本用户。我正在尝试执行这个postgresql命令(输出删除名称类似于r_395的表的命令)

SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables where tablename like 'r_395%';

此查询的输出是:

?column?      
--------------------
 DROP TABLE r_395_0
 DROP TABLE r_395_1
 DROP TABLE r_395_2
 DROP TABLE r_395_3
 DROP TABLE r_395_4
 DROP TABLE r_395_5
 DROP TABLE r_395_6
 DROP TABLE r_395_7
 DROP TABLE r_395_8
 DROP TABLE r_395_9
(10 rows)

使用bash使用此命令:

/bin/su - postgres -c "/usr/bin/psql database -c SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables where tablename like 'r_395%'" > droptables

但是我收到了这个错误:

psql: FATAL:  role "DROP TABLE " does not exist
-bash: tablename: command not found

我做错了什么?

1 个答案:

答案 0 :(得分:2)

可能由于报价被重新解释,因为你包括了-c。你需要这样的东西:

su - postgres -c "/usr/bin/psql database -c \"SELECT 'DROP TABLE ' || ....

即。你需要再次将arg引用到psql的-c选项。

这很快变成一团糟。我建议你改为获得你希望psql执行的命令作为输出生成,然后让psql执行stdin(通过不传递-c)。这避免了引用地狱,并使测试更容易(只需将管道取出到psql,你就会看到它会得到什么)。那就是:

echo "SELECT 'DROP TABLE ' || tablename ... " | su - postgres -c "psql database"

或使用“here here”:

su - postgres -c "psql database" <<EOF
SELECT 'DROP TABLE ' || tablename ...
EOF