我正在处理一个批处理文件,它将数据导入到我用于测试的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
命令行选项,是否有一种特殊的方法可以转义“大于”和“小于”字符?
答案 0 :(得分:0)
结合使用建议和“尝试和错误”,我相信我找到了通过批处理文件执行此特定SQL命令的正确语法。
$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
),我仍然遇到错误。它们是不同的错误(给我一些太多参数的废话),但仍然无法执行。!=
语句括在双引号而不是单引号中。还是不在那里。最终结果如下:
SELECT
我想我已经假设了,因为我发现的所有示例都使用单引号将SQL语句括起来,所以我使用了 。显然,该假设是错误的。
无论如何,这一切现在似乎都可以正常工作。希望这可以帮助想要完成类似任务的其他人。