У моей команды есть локальная среда разработки, содержащая приложение Ruby on Rails, которое подключается к базе данных Postgres, чтобы получить некоторую информацию об аэропортах и использовать ее для дальнейших запросов. Локальная среда предназначена для дублирования нашей производственной среды (обе работают в одних и тех же контейнерах докеров).
Локальный контейнер 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 локально.
- Я также могу запустить команду с помощью psql после "docker exec -it'ing" в контейнере Postgres локально.
Выполнение запросов Amazon RDS Postgres
- В процессе производства наше приложение Rails пытается выполнить рассматриваемый запрос, но возвращает пустой набор данных: {}
Следует отметить, что он успешно подключается к БД и «успешно» выполняет запрос после правильной аутентификации, поэтому на самом деле проблема здесь в том, что запрос не возвращает / не соответствует данным.
- Когда я вручную подключаюсь к нашей базе данных Amazon RDS Postgres с помощью psql, я могу правильно пройти аутентификацию и выполнить запрос, но снова получаю результат null / {}. Все остальные запросы работают.
В обоих вышеупомянутых случаях запрос выполняется правильно. При выполнении вручную он, в частности, возвращает следующее:
iata
------
(0 rows)
Другие интересные факты
- Укажите локальный контейнер рельсов в производственной RDS Postgres - Результат: Postgres возвращает {}, даже если контейнеры Postgres МОГУТ выполнить тот же запрос и вернуть ожидаемый список данных при указании на локальную БД. Возвращаемый результат в этом случае воспроизводит производственное поведение: {}
- Подключитесь по SSH к инстансу Amazon EC2, подключенному к базе данных RDS в той же группе VPC / Security, и выполните указанную выше команду, чтобы убедиться, что это не проблема с разрешениями. Результат: То же, что и удаленный запрос: {}
- Подсчет таблицы в обоих экземплярах (оба возвращают одинаковый результат ~ 5880): $ SELECT COUNT (*) FROM airport;
- Listing tables возвращает идентичный список таблиц как в Amazon RDS, так и в локальном Postgres.
Движение вперед
На данный момент я исхожу из предположения, что должны быть различия между тем, как Amazon RDS для Postgres обрабатывает данные и локальный Postgres 9.6 db, но я не смог найти никаких указаний на это в le google. Надеюсь, кто-то сталкивался с чем-то подобным.
Версии Postgres
ВЫБРАТЬ версию (); возвращает следующее:
Версия RDS Postgres
PostgreSQL 9.6.2 на x86_64-pc-linux-gnu, скомпилирован gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-бит (1 строка)
Локальная версия Postgres
PostgreSQL 9.6.3 на x86_64-pc-linux-musl, скомпилирован 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)