Ant*_*nen 9 elixir phoenix-framework
我是Elixir和Phoenix Framework的新世界.我正在尝试关注TheFireHoseProject教程,但是在使用Ecto查询原始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.Result{rows: [row]} = query
{id, saying, author} = row
%Splurty.Quote{id: id, saying: saying, author: author}
end
end
Run Code Online (Sandbox Code Playgroud)
我收到一个运行时错误,即Ecto.Adapters.Postgres.query不存在(未定义的函数).
我试图搜索Ecto文档,发现可能有一个名为run_query的函数,但它也不起作用.
我想我正在使用Ecto 1.1.4并且我没有找到任何关于如何使用Ecto查询原始SQL的好(最新)样本.
firehoseproject的链接是:http://phoenix.thefirehoseproject.com/
小智 10
alias Ecto.Adapters.SQL
querystring = "..."
result = SQL.query(Repo, querystring , [])
Run Code Online (Sandbox Code Playgroud)
然后您可以将结果添加到列表中,例如:
list = []
case result do
{:ok, columns} ->
list = for item <- columns.rows do
List.first(item)
end
_ -> IO.puts("error")
end
Run Code Online (Sandbox Code Playgroud)
mic*_*ala 10
如果您只需要将原始SQL添加到正常的Ecto查询,则可以使用fragment/1:
from q in Quote, order_by: fragment("RANDOM()"), limit: 1
Run Code Online (Sandbox Code Playgroud)
它经常足够,而且更容易处理.您通常可以在Ecto查询的任何部分使用fragment/1.为了更好的使用,您可以定义一个宏,使您能够很好地适应Ecto的DLS:
defmodule QueryHelpers do
defmacro random() do
quote do
fragment("RANDOM()")
end
end
end
Run Code Online (Sandbox Code Playgroud)
后来使用它:
import QueryHelpers
from q in Quote, order_by: random(), limit: 1
Run Code Online (Sandbox Code Playgroud)