elixir - 在 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 进行查询)是否是不好的做法,如果是,我该如何解决这个问题?我也许可以发送多个查询来获取每个查询的总和,但这并不有效。
解决方案
我不会说这是一个不好的做法。不过,相信更多熟悉 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 函数中使用布尔值,而且我不知道您使用的是什么数据库。
推荐阅读
- excel - 识别重复项或 COUNTIF > 255 个字符(长文本)
- django - 从 html 文件中获取数据并将其保存到模型 django
- windows - Selenium 如何点击 Ctrl + p
- crashlytics - 我在哪里可以找到 Fabric setUserIdentifier 键值?
- mysql - SQL 附加列或多对一关系
- r - RTVS 绘图断开 R 会话
- memory - Ubuntu 不使用非活动内存并进行交换。为什么?
- javascript - Reactjs/Javascript 是将二维数组打印到表格中的最有效方法
- google-chrome - 如何在applescript上向下滚动?
- python - 用相同的值填充列,除了组内的第一行