Elixir 原始SQL与exto
我对长生不老药和凤凰框架的世界很陌生。我正试图学习FirehoseProject教程,但在使用Exto查询原始SQL时遇到了问题。教程说这应该可以:Elixir 原始SQL与exto,elixir,phoenix-framework,Elixir,Phoenix Framework,我对长生不老药和凤凰框架的世界很陌生。我正试图学习FirehoseProject教程,但在使用Exto查询原始SQL时遇到了问题。教程说这应该可以: defmodule Queries do def random do query = Ecto.Adapters.Postgres.query( Repo, "SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1", []) %Postgrex
defmodule Queries do
def random do
query = Ecto.Adapters.Postgres.query(
Repo,
"SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1",
[])
%Postgrex.Result{rows: [row]} = query
{id, saying, author} = row
%Splurty.Quote{id: id, saying: saying, author: author}
end
end
我得到一个运行时错误,即exto.Adapters.Postgres.query不存在(未定义的函数)
我试图搜索EXTO文档,发现可能有一个名为run_query的函数,但它也不起作用
我想我使用的是Ecto 1.1.4,但我没有找到任何关于如何使用Ecto查询原始SQL的好(最新)示例
firehoseproject的链接是:
然后您可以将结果添加到列表中,例如:
list = []
case result do
{:ok, columns} ->
list = for item <- columns.rows do
List.first(item)
end
_ -> IO.puts("error")
end
list=[]
案例结果如何
{:好的,列}->
列表=对于项目IO.puts(“错误”)
结束
如果只需将原始SQL添加到正常的Ecto查询中,则可以使用:
这样做的次数足够多,而且更容易处理。您通常可以在EXTO查询的任何部分中使用fragment/1。为了更好地使用,您可以定义一个宏,使您能够很好地适应EXTO的DLS:
defmodule QueryHelpers do
defmacro random() do
quote do
fragment("RANDOM()")
end
end
end
然后使用它:
import QueryHelpers
from q in Quote, order_by: random(), limit: 1
查询现在似乎可以工作了,但是我在将结果映射到我的对象模型(Quote)时遇到了问题。一般来说,我认为只有我在学习长生不老药。基本上,这可以解决我目前的问题,但为了学习,我想看看如何使用EXTO执行完整的原始sql。无论如何,这也是很高兴知道,并可能会在未来派上用场,谢谢!
defmodule QueryHelpers do
defmacro random() do
quote do
fragment("RANDOM()")
end
end
end
import QueryHelpers
from q in Quote, order_by: random(), limit: 1