代码之家  ›  专栏  ›  技术社区  ›  Necevil

为什么这个Postgres Select查询在本地Docker容器中工作,而在Amazon RDS Postgres上不工作?

  •  1
  • Necevil  · 技术社区  · 7 年前

    本地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查询执行

    应该注意的是,它成功地连接到DB和 “成功”在正确验证后进行查询,因此 实际上,这里的问题是查询没有正确返回/匹配数据。

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

    在上述两种情况下,查询都会正确执行。当手动执行时,它具体返回以下内容:

    iata 
    ------ 
    (0 rows)
    

    其他有趣的事实

    1. 将本地rails容器指向生产RDS Postgres结果:Postgres返回{},即使Postgres容器在指向本地DB时可以执行相同的查询并返回预期的数据列表。本例中返回的结果再现了生产行为:{}
    2. SSH连接到同一专有网络/安全组中连接到RDS DB的Amazon EC2实例中,并运行上述命令以确保这不是权限问题–结果:与远程查询相同:{}
    3. 在两个实例上计算表(都返回相同的结果~ 5880): $SELECT COUNT(*)来自机场;
    4. 列表表在Amazon RDS和本地Postgres上返回相同的表列表

    继续前进

    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行)

    x86_64-pc-linux-musl上的PostgreSQL 9.6.3,由gcc(Alpine)编译

    带有结果的堆栈溢出建议

    从@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)
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Vao Tsun    7 年前

    INNER JOIN OUTER JOIN 将为缺少的键追加带有null的行,因此airports表的行数将满。要么从结果中,要么只是通过检查计数 regions, airports_regions, routes

        2
  •  0
  •   Necevil    7 年前

    由于@VaoTsun的评论最初让我走上了正确的道路,我接受了他的答案(也可以在这里找到)。

    我本应该问的真正问题实际上是“我如何确保导入Amazon RDS Postgres的DB转储完好无损?”

    这里的大部分混乱是因为我导入转储文件时,亚马逊RDS没有抛出任何错误,而且我的Rails应用程序中面向web的部分正确地显示了几乎所有的数据。

    这是因为大多数表与所有数据一起正确导入,并且创建了所有表。因此,列出表/模式会使所有内容看起来都正确,对所有表(只有一个表除外)的所有查询都会得到正确答案。

    最后,我返回并选择了数据库中每个表上的所有内容: 从每个_table_名称中选择*;

    一个特定表在远程RDS数据库上没有返回任何结果,而在本地返回了预期结果。一旦发生这种情况,我从Amazon RDS中删除了数据库,并重新导入了所有内容。导入期间没有错误(与上次一样),但在逐个选择每个表中的“全部”以验证正确导入的数据后,所有表都存在数据。