psql 批处理文件 - 转义 "Not Equal" 运算符

psql Batch File - Escaping "Not Equal" Operator

我正在处理一个批处理文件,它将数据导入到我用于测试的 PostgreSQL 数据库中。批处理文件删除所有数据库,然后 recreates/reloads 从我们的生产数据库生成的先前转储文件中删除它们。但是,如果我不小心打开了 server/database 的连接,有时 运行 就会遇到问题。 "drop" 部分失败,因为仍有用户连接(我)。

我一直在尝试 "tweak" 我的批处理文件中包含一条命令,以便在发出删除所有用户的命令之前断开所有用户与数据库的连接,但我无法获取该部分 (断开连接)工作。我从另一个 SO 问题 How to drop a PostgreSQL database if there are active connections to it?, and I've been looking at other questions like 中获取了断开代码以寻求语法方面的帮助。

我还在 PostgreSQL 官方文档的 9.2. Comparison Functions and Operators 页面上看到了不等于运算符的 "alternate" 语法,但这似乎也使用了 "special" 字符需要转义,所以我不确定如何进行。

此时,批处理文件如下所示:

@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 查询外,其他一切正常。每次我 运行 时,我都会收到奇怪的错误,指示路径、文件或其他类似问题。我相信我已经将问题缩小到查询中的 "not equal" 运算符 (<>),但我似乎无法找到正确的方法来逃避这个问题,所以它不会尝试通过管道来自未定义文件的数据。

我试过在运算符中的一个或两个字符前面使用单反斜杠 (\) 和双反斜杠 (\),但似乎没有工作。有没有特殊的方法来转义 psql 中 -c 命令行选项的 "greater than" 和 "less than" 字符?

结合使用建议和 "trial & error",我相信我找到了通过批处理文件执行此特定 SQL 命令的正确语法。

  1. 尝试使用 "alternative" 不等于运算符 (!=),我仍然遇到错误。它们是不同的错误(它给我一些关于太多参数的废话),但它仍然无法执行。
  2. 根据评论中@Compo 的建议,我尝试用双引号而不是单引号将整个 SELECT 语句括起来。还不够。
  3. 最后,我删除了之前在数据库名称周围使用的 "extra" 单引号。查询似乎已正确执行。

最终结果如下所示:

@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"

我想我已经假设了,因为我找到的所有示例都使用单引号将 SQL 语句括起来,这就是我 不得不 使用的.显然,这个假设是不正确的。

无论如何,现在一切似乎都在正常工作。希望这对希望完成类似事情的其他人有所帮助。