使用Ecto运行自定义sql查询

use*_*595 9 elixir ecto

我正在玩Elixir&Ecto的东西.我想创建自定义SQL查询,它使用一些postgres特定的权限(在这种情况下:它搜索postgres数组).

这是我正在尝试做的事情:

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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它正在逃脱(所以它应该产生......像这样:)

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))
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Jos*_*lim 17

您可以使用片段将表达式发送到DB:

from g in MyModel,
  where: fragment("? = ANY(?)", "sample_tag", g.tags)
Run Code Online (Sandbox Code Playgroud)


Mar*_*var 6

您可以使用 Ecto 通过 Ecto 运行 sql

Ecto.Adapters.SQL.query(Repo, "sql here")
Run Code Online (Sandbox Code Playgroud)

还有第三个参数,用于准备好的语句。

  • +1 文档 [此处](http://hexdocs.pm/ecto/Ecto.Adapters.SQL.html#query/4)。第三个参数是一个用于插值的数组。文档中的示例演示最好:`iex&gt; Ecto.Adapters.SQL.query(MyRepo, "SELECT $1::integer + $2", [40, 2])` `%{rows: [{42}], num_rows :1}` (3认同)