原始 SQL 与 Ecto
Raw SQL with Ecto
我对 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 的好的(最新的)示例。
firehose 项目的 link 是:http://phoenix.thefirehoseproject.com/
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
如果您只需要将原始 SQL 添加到其他正常的 Ecto 查询中,您可以使用 fragment/1:
from q in Quote, order_by: fragment("RANDOM()"), limit: 1
经常这样就够了,处理起来也容易多了。您通常可以在 Ecto 查询的任何部分使用 fragment/1。为了更好地使用,您可以定义一个宏,使您能够很好地适应 Ecto 的 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
我对 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 的好的(最新的)示例。
firehose 项目的 link 是:http://phoenix.thefirehoseproject.com/
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
如果您只需要将原始 SQL 添加到其他正常的 Ecto 查询中,您可以使用 fragment/1:
from q in Quote, order_by: fragment("RANDOM()"), limit: 1
经常这样就够了,处理起来也容易多了。您通常可以在 Ecto 查询的任何部分使用 fragment/1。为了更好地使用,您可以定义一个宏,使您能够很好地适应 Ecto 的 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