2015-04-02 92 views
8

我正在玩Elixir & Ecto的東西。我想創建自定義的SQL查詢,它使用了一些特定於postgres的權限(在這種情況下:它搜索postgres數組)。用Ecto運行自定義sql查詢

這裏就是我想要做的事:

iex(5)> query = from g in MyModel, where: "'sample_tag' = ANY(tags)", select: g #Ecto.Query<from g in MyModel, where: "'sample_tag' = ANY(tags)", select: g> 
iex(6)> Repo.all(query)              [debug] SELECT g0."id", g0."name", g0."description", g0."image_file_name", g0."image_file_size", g0."image_updated_at", g0."image_content_type" FROM "my_model" AS g0 WHERE ('''sample_tag'' = ANY(tags)') [] (0.9ms) 

unfortunaltely,它被轉義(所以它應該產生某事像這樣:。)

SELECT g0."id", g0."name", g0."description", g0."image_file_name", g0."image_file_size", g0."image_updated_at", g0."image_content_type" FROM "my_mode." AS g0 WHERE ('sample_tag' = ANY(tags)) 

我怎樣才能做到這一點?

回答

16

您可以使用fragments發送表情到DB:

from g in MyModel, 
    where: fragment("? = ANY(?)", "sample_tag", g.tags) 
+0

謝謝,像魅力 – user1105595 2015-04-03 07:48:26

3

可以使用

Ecto.Adapters.SQL.query(Repo, "sql here") 

還有第三個PARAM,準備語句通過外生運行SQL。

+2

+1文檔[這裏](http://hexdocs.pm/ecto/Ecto.Adapters.SQL.html#query/4)。第三個參數是一個用於插值的數組。來自文檔的示例演示得最好: 'iex> Ecto.Adapters.SQL.query(MyRepo,「SELECT $ 1 :: integer + $ 2」,[40,2])' '%{rows:[{42}] ,num_rows:1}' – Jay 2015-08-04 16:14:09