psql批处理文件-转义“不等于”运算符

时间:2019-01-25 05:11:32

标签: batch-file psql

我正在处理一个批处理文件,它将数据导入到我用于测试的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命令行选项,是否有一种特殊的方法可以转义“大于”和“小于”字符?

1 个答案:

答案 0 :(得分:0)

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

  1. 尝试使用“替代”不等于运算符($objs =@(); $output = Import-Csv -Path "c:\users\patrick\desktop\RelayFiles\RelayMemberships\file2concatenate.csv" | ForEach { $Object = New-Object PSObject -Property @{ unique_sis_group_id = [String]::Concat($_.unique_sis_group_id, $_.unique_sis_user_id) unique_sis_user_id = $_.unique_sis_school_id unique_sis_school_id = $_.mm_admin mm_admin = 0 } $objs += $Object; } $objs | Select-Object "unique_sis_group_id", "unique_sis_user_id", "unique_sis_school_id", "mm_admin" | Export-CSv -NoTypeInformation c:\users\patrick\desktop\RelayFiles\RelayMemberships\memberships.csv ),我仍然遇到错误。它们是不同的错误(给我一些太多参数的废话),但仍然无法执行。
  2. 我使用@Compo的建议,然后尝试将整个!=语句括在双引号而不是单引号中。还是不在那里。
  3. 最后,我从以前删除了数据库名周围使用的“多余”单引号。该查询似乎已正确执行。

最终结果如下:

SELECT

我想我已经假设了,因为我发现的所有示例都使用单引号将SQL语句括起来,所以我使用了 。显然,该假设是错误的。

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