【问题标题】:Can a connection command be embedded in a psql script?可以将连接命令嵌入到 psql 脚本中吗?
【发布时间】:2021-08-20 05:11:25
【问题描述】:

我正在交互式地运行一个脚本来测试它。元命令 \c 不能很好地与标准 sql 命令配合使用:它似乎想自己运行。这是在脚本中运行时发生的情况

\set username steve

\c pubkey  :username

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO :username;
GRANT ALL PRIVILEGES ON ALL sequences IN SCHEMA public TO :username;

结果:

invalid integer value "ALL" for connection option "port"
Previous connection kept

但是如果“\c”命令是自己运行的,那么后续的grant 是成功的。有没有办法在 psql 脚本中嵌入“\c”连接命令?

【问题讨论】:

  • 我猜变量username 错误地包含了一些空格。端口将是\c 的第四个参数。
  • @LaurenzAlbe 它没有空格:还要考虑“\c”命令在自己执行时有效。
  • 既然你没有显示设置username的代码,我就不能再说了。但是错误信息很清楚。
  • 似乎 psql 将 :username 解释为用户,“GRANT”解释为主机,“ALL”解释为端口。所以问题似乎是命令的分离。文件中的行尾字符是什么?
  • @JuliusTuskenis 这是在 macOS 上,行尾是 \cr(不是 \cr\lf)或十六进制 '0x0a'

标签: postgresql psql


【解决方案1】:

似乎在psql 中运行与在脚本本身中的行为不同:使用-f 从命令行运行上述代码确实有效

psql postgres -f create_dbs.sql -a > db.out 2>&1

而从 psql 运行 '\c` 命令似乎需要隔离。

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 2020-05-27
    • 2010-12-26
    • 2014-09-05
    • 2020-04-15
    • 1970-01-01
    • 2019-04-12
    • 2013-03-03
    相关资源
    最近更新 更多