2015-04-02 8 views
8

Ich spiele mit Elixir & Ecto Zeug. Ich möchte eine benutzerdefinierte SQL-Abfrage erstellen, die einige Postgres-spezifische Potenzen verwendet (in diesem Fall: es sucht Postgres-Array).Führen Sie benutzerdefinierte SQL-Abfrage mit Ecto

Hier ist, was ich versuche zu tun:

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, ist es entgangen ist (so sollte es etw produzieren wie folgt aus:.)

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)) 

Wie kann ich das erreichen?

Antwort

16

Sie können fragments verwenden Ausdrücke an die DB zu senden:

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

Danke, funktioniert wie ein Charme – user1105595

3

Sie SQL

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

Es gibt eine dritte param, für Prepared Statements über Ecto ausführen können.

+2

+1 Docs [hier] (http://hexdocs.pm/ecto/Ecto.Adapters.SQL.html#query/4). Der dritte Parameter ist ein Array für interpolierte Werte. Das Beispiel aus der Dokumentation zeigt am besten: 'iex> Ecto.Adapters.SQL.query (MyRepo," SELECT $ 1 :: integer + $ 2 ", [40, 2])' '% {rows: [{42}] , num_rows: 1} ' – Jay