Batch file psql批处理文件-转义“;“不相等”;操作人员

Batch file psql批处理文件-转义“;“不相等”;操作人员,batch-file,psql,Batch File,Psql,我正在处理一个批处理文件,该文件将数据导入用于测试的PostgreSQL数据库。批处理文件删除所有数据库,然后从生产数据库生成的先前转储文件中重新创建/重新加载它们。但是,如果我不小心打开了与该服务器/数据库的连接,有时会遇到问题。“删除”部分失败,因为仍有用户连接(me) 在发出删除用户的命令之前,我一直试图用一个命令“调整”我的批处理文件,以断开所有用户与数据库的连接,但我无法使该部分(断开连接)正常工作。我从另一个SO问题中获取了断开连接的代码,并且我一直在研究其他问题,比如语法方面的帮助

我正在处理一个批处理文件,该文件将数据导入用于测试的PostgreSQL数据库。批处理文件删除所有数据库,然后从生产数据库生成的先前转储文件中重新创建/重新加载它们。但是,如果我不小心打开了与该服务器/数据库的连接,有时会遇到问题。“删除”部分失败,因为仍有用户连接(me)

在发出删除用户的命令之前,我一直试图用一个命令“调整”我的批处理文件,以断开所有用户与数据库的连接,但我无法使该部分(断开连接)正常工作。我从另一个SO问题中获取了断开连接的代码,并且我一直在研究其他问题,比如语法方面的帮助

在PostgreSQL官方文档的页面上,我也看到了非相等运算符的“替代”语法,但这似乎也使用了需要转义的“特殊”字符,因此我不确定如何继续

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

@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"
@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"
@Echo关闭
设置PGPASSWORD=PASSWORD
cd/D“C:\PostgreSQL\bin”
psql.exe-h localhost-p 5432-d postgres-U username-c“从pg_stat_activity中选择pg_terminate_后端(pg_stat_activity.pid),其中pg_stat_activity.datname=''betadb''和pid\pg U backend_pid();”
dropdb.exe-h localhost-p 5432-U用户名betadb
psql.exe-h localhost-p 5432-d postgres-U用户名<“C:\postgresql\prodserverdump.sql”
除了
pg\u terminate\u后端
查询之外,其他所有功能都正常工作。每次运行它时,都会出现奇怪的错误,表明路径、文件或其他类似的问题。我相信我已经将问题缩小到了查询中的“notequal”操作符(
),但我似乎找不到正确的方法来逃避这个问题,因此它不会尝试从未定义的文件中导入数据


我曾尝试在操作符中的一个或两个字符前面使用单反斜杠(
\
)和双反斜杠(
\
),但似乎不起作用。psql中的
-c
命令行选项是否有特殊的方法来转义“大于”和“小于”字符?

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

  • 尝试使用“alternative”not equal运算符(
    !=
    ),仍然会出现错误。它们是不同的错误(这让我对太多的参数不屑一顾),但它仍然无法执行
  • 使用@Compo在评论中的建议,我尝试将整个
    SELECT
    语句用双引号括起来,而不是单引号。还是不太好
  • 最后,我删除了以前在数据库名称周围使用的“额外”单引号。查询似乎已正确执行
  • 最终结果如下所示:

    @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"
    
    @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"
    
    @Echo关闭
    设置PGPASSWORD=PASSWORD
    cd/D“C:\PostgreSQL\bin”
    psql.exe-h localhost-p 5432-d postgres-U username-c“从pg_stat_activity中选择pg_terminate_后端(pg_stat_activity.pid),其中pg_stat_activity.datname='betadb'和pid!=pg_backend_pid()
    dropdb.exe-h localhost-p 5432-U用户名betadb
    psql.exe-h localhost-p 5432-d postgres-U用户名<“C:\postgresql\prodserverdump.sql”
    
    我想我已经假设了,因为我发现的所有示例都使用单引号来包围SQL语句,这就是我必须使用的。显然,这一假设是错误的


    不管怎样,现在一切似乎都正常运转。希望这能帮助其他希望完成类似任务的人。

    ^
    是CMD的转义字符。请参阅CMD入门。我建议您尝试使用双引号而不是单引号,并转义任何内部双引号,
    psql.exe-h localhost-p 5432-d postgres-U username-c“从pg_stat_activity.datname=\“betadb\”和pid pg_backend_pid()”中选择pg_terminate_backend(pg_stat_activity.pid)。或者使用单引号作为内部引号,
    psql.exe-h localhost-p 5432-d postgres-U username-c“从pg_stat_activity中选择pg_terminate_后端(pg_stat_activity.pid),其中pg_stat_activity.datname='betadb'和pid pg_backend_pid()”
    @catcat-谢谢,虽然这里的问题似乎更多地与SQL命令字符串中的字符转义有关,SQL命令字符串是执行psql.exe的参数。@Compo-谢谢,但我相信我对这个建议做了一些“调整”。
    -c
    参数值周围的双引号使我比原来更进一步。奇怪的是,通过批处理文件运行psql的所有引用都在该值周围使用了单引号。我想我只是假设这是一个要求。