Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 在Phoenix中使用原始文本SQL查询是一种不好的做法吗?_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 在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` =

我有一个使用“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进行查询)是否是一种不好的做法,如果是,我该如何解决这个问题?我可能会发送多个查询以获取每个查询的总和,但这并不高效。

我不会说这是一种不好的做法。然而,我相信更多熟悉菲尼克斯的人至少有一些经验。我相信使用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
)。请记住,模块属性是在编译时计算的,因此,如果您有实际的数据库调用,您将永远得到相同的结果。