繁体   English   中英

Docker PSQL 查询问题:“列<column_name>不存在”

[英]Docker PSQL Query Issue: "Column <column_name> does not exist"

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

我的脚本.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 容器实现的。

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

SQL 中的字符串常量是由单引号 (') 包围的任意字符序列,例如 'This is a string'。 要在字符串常量中包含单引号字符,请编写两个相邻的单引号,例如,'Dianne''s horse'。 请注意,这与双引号字符 (") 不同。

请参阅postgres 手册的第 4.1.2.1 节

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

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

 UPDATE "my_table" SET "a" = 5;

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

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

  1. 字符串查询需要使用单引号
  2. 在 psql 命令中对 -c 使用双引号( 答案线程
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;\""

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM