使用Ecto的原始SQL

时间:2016-03-16 17:31:49

标签: 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

我收到Ecto.Adapters.Postgres.query不存在的运行时错误(未定义的函数)。

我试图搜索Ecto文档,发现可能有一个名为run_query的函数,但它也不起作用。

我想我正在使用Ecto 1.1.4而且我没有找到任何关于如何使用Ecto查询原始SQL的好(最新)样本。

firehoseproject的链接是:http://phoenix.thefirehoseproject.com/

2 个答案:

答案 0 :(得分:10)

alias Ecto.Adapters.SQL

querystring = "..."

result = SQL.query(Repo, querystring , [])

然后您可以将结果添加到列表中,例如:

list = []

case result do
  {:ok, columns} ->
            list = for item <- columns.rows do
                List.first(item)
            end
  _ -> IO.puts("error")
end

答案 1 :(得分:10)

如果只需要将原始SQL添加到正常的Ec​​to查询中,您可以使用fragment/1

it.remove()

这通常足够,而且更容易处理。您通常可以在Ecto查询的任何部分使用fragment / 1。为了更好的使用,你可以定义一个宏,让你很好地适应Ecto的DLS:

from q in Quote, order_by: fragment("RANDOM()"), limit: 1

后来使用它:

defmodule QueryHelpers do
  defmacro random() do
    quote do
      fragment("RANDOM()")
    end
  end
end