gpt4 book ai didi

sql - 为什么此 Postgres Select Query 在本地 Docker 容器中有效,但在 Amazon RDS Postgres 中无效?

转载 作者:行者123 更新时间:2023-11-29 13:47:01 25 4
gpt4 key购买 nike

我的团队有一个本地开发环境,其中包含一个 Ruby on Rails 应用程序,该应用程序连接到 Postgres 数据库以检索有关机场的一些信息并使用这些信息进行进一步查询。本地环境旨在复制我们的生产环境(都在相同的 docker 容器中运行)。

本地 Postgres 容器使用官方 Postgres:9.6-alpine 容器,可在此处找到:https://hub.docker.com/_/postgres/

有问题的查询是:

SELECT airports.iata FROM "routes" INNER JOIN "regions" ON "regions"."id" = "routes"."origin_id" INNER JOIN "airports_regions" ON "airports_regions"."region_id" = "regions"."id" INNER JOIN "airports" ON "airports"."id" = "airports_regions"."airport_id";

本地查询执行

  1. 当我们的 rails 应用在本地调用时,上述命令会正确执行。
  2. 我还可以在“docker exec -it'ing”到本地 Postgres 容器后使用 psql 运行命令。

Amazon RDS Postgres 查询执行

  1. 在生产环境中,我们的 Rails 应用尝试运行有问题的查询,但返回一个空数据集:{}

It should be noted that it successfully connects to the DB and "successfully" makes the query after properly authenticating, so really the issue here is that the query doesn't properly return / match the data.

  1. 当我使用 psql 手动连接到我们的 Amazon RDS Postgres 数据库时,我可以正确进行身份验证,并且可以执行查询,但我再次收到 null/{} 结果。所有其他查询似乎都有效。

在上述两种情况下,查询都能正确执行。手动执行时,它专门返回以下内容:

iata 
------
(0 rows)

其他有趣的事实

  1. 将本地 Rails 容器指向生产 RDS Postgres — 结果:Postgres 返回 {},即使 Postgres 容器在指向本地数据库时可以执行相同的查询并返回预期的数据列表。在这种情况下返回的结果重现了生产行为:{}
  2. 通过 SSH 连接到连接到同一 VPC/安全组中的 RDS 数据库的 Amazon EC2 实例并运行上述命令以确保它不是权限问题 — 结果:与远程查询相同:{}
  3. 计算两个实例上的表(都返回相同的结果~5880):$ SELECT COUNT(*) FROM airports;
  4. 列出表在 Amazon RDS 和本地 Postgres 上返回相同的表列表

继续前进

在这一点上,我假设 Amazon RDS for Postgres 处理数据的方式与本地 Postgres 9.6 db 之间一定存在差异,但我无法在 le google 上找到任何这方面的迹象。希望有些人遇到过类似的事情。

Postgres 版本

选择版本();返回以下内容:

RDS Postgres 版本

PostgreSQL 9.6.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit (1 row)

本地 Postgres 版本

PostgreSQL 9.6.3 on x86_64-pc-linux-musl, compiled by gcc (Alpine 6.2.1) 6.2.1 20160822, 64-bit (1 row)

带结果的 StackOverflow 建议

从@Aleroot 将查询修改为:

SELECT a.iata FROM routes ru JOIN regions re ON re.id = ru.origin_id JOIN airports_regions ar ON ar.region_id = re.id JOIN airports a ON a.id = ar.airport_id;

结果:(相同)

 iata 
------
(0 rows)

最佳答案

正如我们在评论中所说,您可以检查结果是否不受其他表的影响。将 INNER JOIN 更改为 OUTER JOIN 将为缺少的键追加带有空值的行,因此 airports 表的行数将填满。无论是从结果,还是仅仅通过检查 regions、airports_regions、routes 表的计数,都应该揭示 RDS 和本地数据库之间的差异。

关于sql - 为什么此 Postgres Select Query 在本地 Docker 容器中有效,但在 Amazon RDS Postgres 中无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46794816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com