【发布时间】:2018-03-29 10:06:09
【问题描述】:
我的团队有一个本地开发环境,其中包含一个 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";
本地查询执行
- 当我们的 Rails 应用在本地调用时,上述命令可以正常执行。
- 我还可以在“docker exec -it'ing”本地进入 Postgres 容器后使用 psql 运行命令。
Amazon RDS Postgres 查询执行
- 在生产中,我们的 Rails 应用尝试运行有问题的查询,但返回一个空数据集:{}
需要注意的是它成功连接到数据库并且 “成功”在正确验证后进行查询,所以 真正的问题是查询没有正确返回/匹配数据。
- 当我使用 psql 手动连接到我们的 Amazon RDS Postgres 数据库时,我可以正确进行身份验证,并且可以执行查询,但我再次收到 null / {} 结果。所有其他查询似乎都有效。
在上述两种情况下,查询都能正常执行。手动执行时,它具体返回以下内容:
iata
------
(0 rows)
其他有趣的事实
- 在生产 RDS Postgres 中指向本地 rails 容器 — 结果:Postgres 返回 {},即使 Postgres 容器在指向本地 DB 时可以执行相同的查询并返回预期的数据列表。这种情况下的返回结果再现了生产行为:{}
- SSH 连接到同一 VPC/安全组中的 RDS DB 的 Amazon EC2 实例并运行上述命令以确保它不是权限问题 — 结果:与远程查询相同:{}
- 计算两个实例上的表(都返回相同的结果 ~5880): $ SELECT COUNT(*) FROM airports;
- 列出表在 Amazon RDS 和本地 Postgres 上返回相同的表列表
前进
此时,我假设 Amazon RDS for Postgres 处理数据的方式与本地 Postgres 9.6 db 之间肯定存在差异,但我无法在 le google 上找到任何迹象。希望有些人遇到过类似的事情。
Postgres 版本
选择版本();返回以下内容:
RDS Postgres 版本
x86_64-pc-linux-gnu 上的 PostgreSQL 9.6.2,由 gcc (GCC) 4.8.2 编译 20140120(Red Hat 4.8.2-16),64 位(1 行)
本地 Postgres 版本
x86_64-pc-linux-musl 上的 PostgreSQL 9.6.3,由 gcc (Alpine 6.2.1) 6.2.1 20160822,64位(1行)
带有结果的 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)
【问题讨论】:
-
你如何ssh到RDS?..
-
@vao 您无法通过 SSH 连接到 RDS,但您可以通过 SSH 连接到连接到 RDS 的 ec2 实例,然后在您进入虚拟中的 ec2 实例后使用 psql 命令连接到数据库私有云/安全组(据我所知,这是最接近的)。
-
只是 ssh 到 ec2/rds 看起来很糟糕 - 很抱歉很挑剔
-
任何带有不匹配 id 的内部联接都会删除行 - 因此仅比较机场的计数是不够的...尝试替换为外部联接以查看 - 也许某些表缺少机场的匹配项?..
-
你确定你有相同的数据集吗?您可以共享相关表的架构吗? id 的类型是什么?它们有什么特别之处,比如对不同语言环境的敏感度?这对于一个 id 来说是不寻常的,但你永远不知道......你是否尝试过从查询中一次删除一个表以查看它在哪个点失败(或开始返回某些内容)?
标签: sql postgresql amazon-rds rails-postgresql postgresql-9.6