【问题标题】:psql Batch File - Escaping "Not Equal" Operatorpsql 批处理文件 - 转义“不等于”运算符
【发布时间】: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 查询外,其他一切都有效。每次我运行它时,我都会收到奇怪的错误,表明路径、文件或其他类似的问题。我相信我已经将问题缩小到查询中的“不等于”运算符(&lt;&gt;),但我似乎找不到正确的方法来逃避这个问题,所以它不会尝试从管道中输入数据未定义的文件。

我尝试在运算符中的一个或两个字符前面使用单反斜杠 (\) 和双反斜杠 (\\),但这似乎不起作用。有没有一种特殊的方法来转义 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 &lt;&gt; 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 &lt;&gt; pg_backend_pid();"
  • @catcat - 谢谢你,虽然这里的问题似乎与转义 SQL 命令字符串中的字符有关,该字符串是执行 psql.exe 的参数。
  • @Compo - 谢谢,我相信我已经在这个建议上稍微“扭曲”了它。 -c 参数值周围的双引号让我比我更进一步。奇怪的是,通过批处理文件运行 psql 的所有引用都在该值周围使用了单引号。我想我只是假设这是一个要求。

标签: batch-file psql


【解决方案1】:

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

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

最终的结果是这样的:

@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 语句括起来,这就是我 必须 使用的。显然,这个假设是不正确的。

无论如何,现在一切似乎都正常运行。希望这可以帮助其他希望完成类似任务的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 2010-11-22
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多