【问题标题】:Docker PSQL Query Issue: "Column <column_name> does not exist"Docker PSQL 查询问题:“列 <column_name> 不存在”
【发布时间】:2021-12-12 06:01:27
【问题描述】:

我正在尝试通过 shell 脚本中的 docker inline 命令执行数据库查询。

myscript.sh:

docker run -it --rm -c "psql -U ${DB_USER} -d ${DB_NAME} -h ${DB_HOST}\
    -c 'select col1, col2 , col3 from table1\
    where table1.col2 = \"matching_text\" order by col1;'"

但我得到一个奇怪的错误:

ERROR:  column "matching_text" does not exist
LINE 1: ...ndow where table1.col2 = "matching_t...

由于某种原因,当我运行它时,psql 认为我的查询中的 matching_text 是指一个列名。我该如何解决这个问题?

注意:我们的数据库是作为 psql docker 容器实现的。

【问题讨论】:

标签: postgresql docker psql


【解决方案1】:

Postgres 手册解释了你需要使用单引号:

SQL 中的字符串常量是由单引号 (') 限定的任意字符序列,例如“这是一个字符串”。要在字符串常量中包含单引号字符,请写下两个相邻的单引号,例如 'Dianne''s horse'。请注意,这与双引号字符 (") 不同。

section 4.1.2.1 of the postgres manual

双引号用于表或列标识符:

还有第二种标识符:分隔标识符或引用标识符。它是通过将任意字符序列括在双引号 (") 中而形成的。分隔标识符始终是标识符,而不是关键字。因此“select”可用于引用名为“select”的列或表,而不带引号的选择将被视为关键字,因此在需要表或列名的地方使用时会引发解析错误。示例可以使用带引号的标识符编写,如下所示:

UPDATE "my_table" SET "a" = 5;

请参阅同一手册的第 4.1.1 节。

【讨论】:

  • 我最初尝试使用单引号,但得到了相同的答案。经过一番挖掘,我找到了答案。我会发布它的链接。
【解决方案2】:

这里的帖子和其他帖子的结合解决了这个问题:

  1. 字符串查询需要使用单引号
  2. 在 psql 命令中为 -c 使用双引号 (Answer thread)
docker run -it --rm -c "psql -U ${DB_USER} -d ${DB_NAME} -h ${DB_HOST}\
    -c \"select col1, col2 , col3 from table1\
    where table1.col2 = 'matching_text' order by col1;\""

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2023-03-22
    • 2017-03-21
    相关资源
    最近更新 更多