【发布时间】:2019-01-25 05:11:32
【问题描述】:
我正在处理一个批处理文件,它将数据导入到我用于测试的 PostgreSQL 数据库中。批处理文件删除所有数据库,然后从我们的生产数据库制作的先前转储文件重新创建/重新加载它们。但是,如果我不小心打开了与该服务器/数据库的连接,我有时会遇到问题。 “丢弃”部分失败,因为仍有用户连接(我)。
我一直在尝试使用命令“调整”我的批处理文件,以在发出删除所有用户的命令之前断开所有用户与数据库的连接,但我无法让该部分(断开连接)工作.我从另一个 SO 问题 How to drop a PostgreSQL database if there are active connections to it? 中获取了断开连接代码,并且我一直在查看其他问题,例如 How to execute postgres' sql queries from batch file?,以寻求语法方面的帮助。
我还在官方 PostgreSQL 文档的9.2. Comparison Functions and Operators 页面上看到了不等于运算符的“替代”语法,但这似乎也使用了需要转义的“特殊”字符,所以我不知道如何继续。
此时,批处理文件如下所示:
@Echo OFF
SET PGPASSWORD=PASSWORD
cd /D "C:\PostgreSQL\bin"
psql.exe -h localhost -p 5432 -d postgres -U username -c 'SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = ''betadb'' AND pid \<\> pg_backend_pid();'
dropdb.exe -h localhost -p 5432 -U username betadb
psql.exe -h localhost -p 5432 -d postgres -U username < "C:\PostgresSQL\prodserverdump.sql"
除pg_terminate_backend 查询外,其他一切都有效。每次我运行它时,我都会收到奇怪的错误,表明路径、文件或其他类似的问题。我相信我已经将问题缩小到查询中的“不等于”运算符(<>),但我似乎找不到正确的方法来逃避这个问题,所以它不会尝试从管道中输入数据未定义的文件。
我尝试在运算符中的一个或两个字符前面使用单反斜杠 (\) 和双反斜杠 (\\),但这似乎不起作用。有没有一种特殊的方法来转义 psql 中-c 命令行选项的“大于”和“小于”字符?
【问题讨论】:
-
^是 CMD 的转义字符。请参阅 stackoverflow.com/questions/41030190/command-to-run-a-bat-file/… 了解 CMD 入门。 -
我建议您尝试使用双引号而不是单引号并转义任何内部双引号,
psql.exe -h localhost -p 5432 -d postgres -U username -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = \"betadb\" AND pid <> pg_backend_pid();"。或使用单引号作为内部引号,psql.exe -h localhost -p 5432 -d postgres -U username -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'betadb' AND pid <> pg_backend_pid();"。 -
@catcat - 谢谢你,虽然这里的问题似乎与转义 SQL 命令字符串中的字符有关,该字符串是执行 psql.exe 的参数。
-
@Compo - 谢谢,我相信我已经在这个建议上稍微“扭曲”了它。
-c参数值周围的双引号让我比我更进一步。奇怪的是,通过批处理文件运行 psql 的所有引用都在该值周围使用了单引号。我想我只是假设这是一个要求。
标签: batch-file psql