首页 > 解决方案 > 在 Phoenix 中使用原始文本 SQL 查询是不好的做法吗?

问题描述

我有一个使用“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`

我想知道在 Phoenix 中执行文本 SQL 查询(而不是使用 Ecto 进行查询)是否是不好的做法,如果是,我该如何解决这个问题?我也许可以发送多个查询来获取每个查询的总和,但这并不有效。

标签: elixirphoenix-frameworkecto

解决方案


我不会说这是一个不好的做法。不过,相信更多熟悉 Phoenix 的人至少对 Ecto 有一定的了解。我相信使用 Ecto 可以让其他开发人员更快地开始为您的项目做出贡献。

话虽如此,如果你真的不想使用 Ecto,你可以只为给定的数据库使用 Elixir 驱动程序。您还可以选择将 afragment用于您不确定或无法在 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 函数中使用布尔值,而且我不知道您使用的是什么数据库。


推荐阅读