Elixir 在Phoenix中使用原始文本SQL查询是一种不好的做法吗?
我有一个使用“AS”和“SUM”的查询。我在Phoenix文档中找不到这方面的任何应用程序,因此我开始怀疑是否应该使用原始SQL查询。我是新来凤凰城的,所以也许我错过了什么 我的问题是:Elixir 在Phoenix中使用原始文本SQL查询是一种不好的做法吗?,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我有一个使用“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` =
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进行查询)是否是一种不好的做法,如果是,我该如何解决这个问题?我可能会发送多个查询以获取每个查询的总和,但这并不高效。我不会说这是一种不好的做法。然而,我相信更多熟悉菲尼克斯的人至少有一些经验。我相信使用Ecto可以让其他开发人员更快地为您的项目做出贡献 话虽如此,如果您真的不想使用EXTO,您可以对给定的数据库使用Elixir驱动程序。您还可以选择对查询中不确定或无法在CTO本身中写入的部分使用a。还有一个函数,您可以在其中对数据库运行文本查询 无论如何,您应该能够将查询编写为:
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不允许在求和函数中使用布尔值,而且我不知道您使用的是什么DB。我不会说这是一种不好的做法。然而,我相信更多熟悉菲尼克斯的人至少有一些经验。我相信使用Ecto可以让其他开发人员更快地为您的项目做出贡献 话虽如此,如果您真的不想使用EXTO,您可以对给定的数据库使用Elixir驱动程序。您还可以选择对查询中不确定或无法在CTO本身中写入的部分使用a。还有一个函数,您可以在其中对数据库运行文本查询 无论如何,您应该能够将查询编写为:
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不允许在求和函数中使用布尔值,我不知道您使用的是什么DB。谢谢。只是想知道,因为这个查询没有任何用户输入(所以它永远保持不变),我可以将它设置为模块属性吗?您可以将实际的查询部分设置为模块属性(
来自p…
)。您将不希望将其包装到实际的数据库调用中(Repo.one
)。请记住,模块属性是在编译时计算的,因此如果您有实际的数据库调用,您将永远得到相同的结果。谢谢。只是想知道,因为这个查询没有任何用户输入(所以它永远保持不变),我可以将它设置为模块属性吗?您可以将实际的查询部分设置为模块属性(来自p…
)。您将不希望将其包装到实际的数据库调用中(Repo.one
)。请记住,模块属性是在编译时计算的,因此,如果您有实际的数据库调用,您将永远得到相同的结果。