2015-04-02 50 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