代码之家  ›  专栏  ›  技术社区  ›  G_Hosa_Phat

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

  •  0
  • G_Hosa_Phat  · 技术社区  · 6 年前

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

    我一直试图用一个命令来“调整”我的批处理文件,在发出删除它们的命令之前,断开所有用户与数据库的连接,但我无法使该部分(断开)工作。我把断开代码从另一个问题 How to drop a PostgreSQL database if there are active connections to it? 我一直在研究其他问题,比如 How to execute postgres' sql queries from batch file? 有关语法的帮助。

    我还看到了不相等运算符的“alternate”语法 9.2. Comparison Functions and Operators 官方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"
    

    除了 pg_terminate_backend 查询。每次运行它时,我都会收到奇怪的错误,指示路径、文件或类似的问题。我相信我已经把问题缩小到“不相等”的算符上了。( <> )在查询中,但我似乎找不到正确的方法来转义它,因此它不会尝试从未定义的文件导入数据。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   G_Hosa_Phat    6 年前

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

    1. 尝试“替代”不相等运算符( != )我还是有错误。它们是不同的错误(这让我对太多的参数有些胡说八道),但它仍然无法执行。
    2. 根据@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语句,所以我认为 使用。显然,这个假设是错误的。

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

    推荐文章