Heroku 和 PostgreSQL 命令行使用 -c/--command 来处理包含需要转义的字符的查询

Heroku and PostgreSQL command-line using -c/--command to process query with characters that need to be escaped

就转义字符而言,我熟悉 MySQL 的语法。但是,由于我目前正在构建的 Rails 应用程序上的 Ruby 使用 PostgreSQL,因此我正在努力让命令行正常运行。我正在尝试 运行 通过 shell 脚本进行基本查询,同时将数据库重新设置为实时数据库的最新备份。

例如,我尝试 运行 的命令如下所示:

psql db_name u_name -c "UPDATE users SET encrypted_password = 'crazy_long_hash_here';"

我理解 运行 查询的安全隐患,但这是针对开发工作站的,我们需要能够以不同的 类 用户身份登录以测试不同的功能。

我在 运行 执行此命令时遇到的问题是应用程序崩溃并出现 Ruby 异常:

BCrypt::Errors::InvalidHash

此消息明确指出散列值不再正确。但是,如果我运行在标准命令行样式中执行相同的命令如下:

psql db_name u_name

db_name=# UPDATE users SET encrypted_password = 'crazy_long_hash_here';
UPDATE (row count)

该命令将密码重置为所需的通用密码,我能够以任何用户身份登录以正确测试任何功能。

我缺少转义程序的哪一部分?散列中使用标准 [0-9][a-zA-Z] 字符集之外的以下字符:

$ .

如有任何帮助,我们将不胜感激,因为 google 在这件事上似乎出奇地沉默。我发现的唯一其他问题没有帮助:Escaping single quotes in shell for postgresql


更新

我也尝试过使用 here-document 语法,但无济于事:

psql db_name u_name << EOF
  UPDATE users SET encrypted_password = 'crazy_long_hash_here';
EOF

视情况而定,稍微摆弄一下就得到了答案。当 运行 命令通过标准 psql 接口时,我需要将 $ 转义为 $

然而,当运行时,这继续失败:

heroku pg:psql -c "UPDATE users SET encrypted_password = 'hash_with_$_in_string';"

答案是双重转义字符,意思是:

heroku pg:psql -c "UPDATE users SET encrypted_password = 'hash_with_\$_in_string';"

一旦 \$ 都被转义,heroku toolbelt 正确地解释了哈希,一切都很好。