我的團隊擁有一個本地開發環境,其中包含一個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 *看起來不好 - 很抱歉挑剔 –