我正在尝试从 bash 文件执行一些 postgres 命令。
我试图通过编写以下行来删除架构
DROP SCHEMA "xxx" IF EXISTS
我这里有两个问题
我不确定如何指定应从中删除架构的数据库
我收到以下错误消息——“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
并且它成功了 :-)