复制完整的数据库

复制完整的数据库

我正在尝试从 bash 文件执行一些 postgres 命令。

我试图通过编写以下行来删除架构

DROP SCHEMA "xxx" IF EXISTS

我这里有两个问题

  1. 我不确定如何指定应从中删除架构的数据库

  2. 我收到以下错误消息——“DROP:未找到命令”

有人能帮我解决这个问题吗?

答案1

您无法直接从 bash 脚本执行 SQL 语句。使用psql将命令发送到数据库服务器。如果您要执行一条(或几条)SQL 语句,则可以这样做

psql -d YOUR_DB_NAME -c "YOUR_SQL_STATEMENT"

确保您的 SQL 语句不包含引号或对其进行适当转义。如果文件中有许多 SQL 语句,您可以像这样执行所有语句

psql -d YOUR_DB_NAME -f FILENAME

上面的 YOUR_DB_NAME 应该替换为您的数据库名称,YOUR_SQL_STATEMENT 应该替换为您要执行的 SQL 语句,FILENAME 是包含要执行的 SQL 语句的文件的名称。

如果需要指定用户名等额外参数,请检查显示的命令使用信息psql -?

另外,请注意,您的语法DROP SCHEMA不正确。应该是

DROP SCHEMA IF EXISTS schema_name;

也可以看看本文档

答案2

当然是 Adam Zalcman

这是最终的解决方案

数据库名称=“xxxx”

复制完整的数据库

pg_dump $数据库名称> mydb.backup

备份我们想要的架构

pg_dump $dbname -s -N'public'>测试.out

删除用户定义架构的

psql -d $数据库名称-c “如果存在aaa CASCADE,则删除模式” psql -d $数据库名称-c “如果存在bbb CASCADE,则删除模式”

恢复架构以恢复适当的权限

cat test.out | psql $dbname

并且它成功了 :-)

相关内容