2016-03-16 26 views
7

Elixir ve Phoenix Framework dünyasında çok yeniyim. TheFireHoseProject öğreticisini takip etmeye çalışıyorum, ancak Ecto ile ham SQL sorgulamada sorun yaşıyorum. öğretici bu çalışması gerekir diyor:Ecto ile Ham 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 

ben Ecto.Adapters.Postgres.query (tanımsız işlev) var olmadığını bir çalışma zamanı hatası alıyorum.

Ecto belgelerinde arama yapmaya çalıştım ve run_query adlı bir işlev olabileceğini gördüm, ancak bu da çalışmıyor.

Sanırım Ecto 1.1.4 kullanıyorum ve Ecto ile ham SQL'i nasıl sorgulayabileceğimi iyi (güncel) örnekler bulamadım. http://phoenix.thefirehoseproject.com/

cevap

9
alias Ecto.Adapters.SQL 

querystring = "..." 

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

Ve sonra böyle örneğin bir listeye sonucu ekleyebilirsiniz:

firehoseproject link

olduğunu

list = [] 

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

sorgu şimdi iş gibi görünüyor, ama sorunları var:

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

Ve sonra kullanmak Sonuçları nesne modelime (Alıntı) haritalamak. Sanırım genel olarak iksiri öğreniyorum. –

9

tek ihtiyacınız bir ekleme sadece ise ham SQL aksi Normal Ecto sorgu fragment/1 kullanabilirsiniz için:

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

Genellikle yeterli ve işlemek için çok daha kolay. Genellikle, Ecto sorgusunun herhangi bir bölümünde parça/1 kullanabilirsiniz. daha güzel kullanımı için, size Ecto en DLS içine sığacak şekilde sağlayacak bir makro tanımlayabilirsiniz:

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

Temel olarak bu benim şu anki problemimi çözecek, ama öğrenme uğruna ecto ile tam ham sql'yi nasıl çalıştırabileceğimi görmek istiyorum. Her neyse, bu da bilmek gerçekten çok güzel ve muhtemelen gelecekte kullanışlı olacak, teşekkürler! –

İlgili konular