Это плохая практика использовать необработанные SQL-запросы с Phoenix? - PullRequest
0 голосов
/ 11 мая 2019

У меня есть запрос, который использует "AS" и "SUM".Я не могу найти какие-либо приложения этого в документации Phoenix, поэтому я начинаю задумываться, стоит ли мне просто использовать необработанные запросы SQL.Я новичок в Фениксе, поэтому, возможно, я что-то пропустил.

Мой запрос:

SELECT SUM(`http` = 1) AS http_prox,
 SUM(`socks` = 1) AS socks_prox, 
 SUM(`is_ssl` = 1) AS ssl_prox,
 SUM(`sneakers` = 1) AS sneak_prox,
 SUM(`shopify` = 1) AS shopify_prox,
 SUM(`google` = 1) AS google_prox,
 SUM(`ebay` = 1) AS ebay_prox,
 SUM(`strawpoll` = 1) AS strawpoll_prox
 FROM `proxies`

Я хочу знать, является ли плохой практикой в ​​Фениксе выполнение текстовых SQL-запросов (вместо того, чтобы делать один, используя Ecto), и если это так, как мне решить эту проблему?Возможно, я мог бы отправить несколько запросов, чтобы получить сумму каждого, но это неэффективно.

1 Ответ

2 голосов
/ 11 мая 2019

Я бы не сказал, что это плохая практика. Тем не менее, я считаю, что все больше людей, знакомых с Фениксом, имеют хоть какой-то опыт работы с Ecto. Я полагаю, что использование Ecto позволит другим разработчикам быстрее начать вносить свой вклад в ваш проект.

С учетом сказанного, если вы действительно не хотите использовать Ecto, вы можете просто использовать драйвер Elixir для своей базы данных. У вас также есть возможность использовать fragment для части запроса, которую вы не уверены или не можете написать в самом Ecto. Также есть функция query, где вы можете выполнить текстовый запрос к вашей базе данных.

Для чего бы вы ни стояли, вы должны написать запрос следующим образом:

MyApp.Repo.one(from p in MyApp.Proxies,
  select: %{http_prox: sum(p.http == 1)
            socks_prox: sum(p.socks == 1),
            ssl_prox: sum(p.is_ssl == 1),
            sneak_prox: sum(p.sneakers == 1),
            shopify_prox: sum(p.shopify == 1),
            google_prox: sum(p.google == 1),
            ebay_prox: sum(p.ebay == 1),
            strawpoll_prox: sum(p.strawpoll == 1)
  })

Имейте в виду, что это не проверено, поскольку Postgres не допускает логическое значение в функции sum, и я не знаю, какую БД вы используете.

...