2016-03-16 11 views
7

私はElixirとPhoenix Frameworkの世界では非常に新しいです。私はTheFireHoseProjectチュートリアルに従おうとしていますが、生のSQLにEctoを照会することに問題があります。チュートリアルでは、これは動作するはずの言葉:EctoでのRaw 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をどのようにクエリできますかに関する良い(最新の)サンプルが見つかりませんでした。 http://phoenix.thefirehoseproject.com/

答えて

9
alias Ecto.Adapters.SQL 

querystring = "..." 

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

そしてあなたは、このような例のリストにその結果を追加することができます:firehoseprojectへ

リンクがあるあなたが必要とするすべてがちょうど追加する場合には

list = [] 

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

が、私は問題を抱えている:

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

し、後でそれを使用します。でも、よりよい使用のために、あなたはエクトのDLSにうまくフィットすることを可能にするマクロを定義することができます結果を私のオブジェクトモデル(Quote)にマッピングします。私はそれが私が一般的にエリキシルを学んでいると思う。 –

9

それ以外の場合は通常のEctoクエリに変換することができます。fragment/1

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

それはしばしば十分であり、扱う方がずっと簡単です。一般に、Ectoクエリの任意の部分でfragment/1を使用できます。クエリが今動作しているよう

import QueryHelpers 
from q in Quote, order_by: random(), limit: 1 
+0

これは基本的に私の現在の問題を解決するだろうが、学習のために私は完全な生SQLをエクトでどのように実行できるか見たいと思う。とにかく、これはまた知っていることは本当にいいですし、おそらく、将来、便利になるでしょう、ありがとう! –

関連する問題