对 Phoenix 使用原始文本 SQL 查询是不好的做法吗?
Is it bad practice to use raw-text SQL queries with Phoenix?
我有一个使用 "AS" 和 "SUM" 的查询。我无法在 Phoenix 文档中找到这方面的任何应用程序,所以我开始怀疑我是否应该只使用原始 SQL 查询。我是 Phoenix 的新手,所以我可能错过了一些东西。
我的查询是:
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 驱动程序。您还可以选择使用 fragment
for the portion of the query you are unsure, or unable, to write within Ecto itself. There is also the 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 不允许在求和函数中使用布尔值,而且我不知道您使用的是什么数据库。
我有一个使用 "AS" 和 "SUM" 的查询。我无法在 Phoenix 文档中找到这方面的任何应用程序,所以我开始怀疑我是否应该只使用原始 SQL 查询。我是 Phoenix 的新手,所以我可能错过了一些东西。
我的查询是:
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 驱动程序。您还可以选择使用 fragment
for the portion of the query you are unsure, or unable, to write within Ecto itself. There is also the 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 不允许在求和函数中使用布尔值,而且我不知道您使用的是什么数据库。