我的团队拥有一个本地开发环境,其中包含一个Ruby on Rails应用程序,该应用程序连接到Postgres数据库以检索有关机场的一些信息,并使用它进行进一步查询。本地环境意味着复制我们的生产环境(都运行在相同的码头集装箱中)。为什么此Postgres Select Query在本地Docker容器中工作,但不在Amazon RDS Postgres上工作?
本地Postgres的容器使用官方的Postgres:9.6高山容器这里找到: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运行命令。
亚马逊RDS Postgres的查询执行
- 在生产我们的Rails应用程序尝试运行有问题的查询,但返回一个空的数据集:{}
应当注意它成功地连接到数据库和 “成功”使正确验证后的查询,所以 真的这里的问题是,查询不正确返回/匹配数据。
- 当我手动连接到我们的亚马逊RDS Postgres数据库使用PSQL,我可以正确地认证,我可以执行查询,但我再次接收空/ {}的结果。所有其他查询似乎都起作用。
- 点本地轨容器在生产RDS Postgres的 - 结果:Postgres的返回{}即使Postgres的容器可以执行相同的查询并在指向本地数据库时返回预期的数据列表。在这种情况下,返回的结果再现了生产行为:{}
- SSH到Amazon EC2实例相同VPC /安全组连接到RDS数据库和运行上面的命令,以确保它不是一个权限问题 - 结果:同远程查询:{}
- 指望两个实例表(均返回相同的结果〜5880): $ SELECT COUNT(*)FROM机场;
- 清单表返回两个亚马逊RDS和相同的表列表本地的Postgres
在上述两种情况下,查询都能正确执行。当手动执行它专门返回下列信息:
iata
------
(0 rows)
其他有趣的事实
展望未来
在这一点上,我的假设下运行,必须有与亚马逊RDS Postgres的是如何处理的数据差异vs当地的Postgres 9.6分贝,但我一直没有能够在谷歌上找到任何迹象。希望有些人遇到类似的事情。
Postgres版本
SELECT version();返回如下:
RDS的Postgres版
的PostgreSQL 9.6.2在x86_64-Linux PC的GNU的,由GCC编译(GCC)4.8.2 20140120(红帽4.8.2-16) ,64位(1行)
本地的Postgres版
在x86_64-PC-Linux的MUSL,与gcc编译的PostgreSQL 9.6.3(高山 6.2.1)6.2.1 20160822 ,64位(1行)
StackOverflow的建议W /结果
从@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实例,然后使用psql命令连接到数据库,一旦你进入ec2实例它位于虚拟私有云/安全组中(据我所知,这是最接近的)。 – Necevil
只是* ssh到ec2/rds *看起来不好 - 很抱歉挑剔 –