2016-03-20 2 views
0

Ich versuche Ecto.Adapters.SQL.query zu verwenden, es funktioniert gut, aber nicht für Arrays. Zum Beispiel versagt diese Aussage:Wie verwende ich Ecto.Adapters.SQL.query mit Arrays?

Ecto.Adapters.SQL.query Repo, "SELECT p.* FROM posts p WHERE p.title in ($1)", 
    [["title1", "title2"]] 

Der Fehler:

** (ArgumentError) Postgrex expected a binary that can be encoded/cast to 
type "text", got ["title1", "title2"]. Please make sure the value you are 
passing matches the definition in your table or in your query or convert 
the value accordingly. 

UPDATE

Es gibt keine einfache Möglichkeit, es zu tun, aber es ist keine Einschränkung von Ecto, es ist Einschränkung der SQL-Datenbanken/PostgreSQL, more details and workaround.

Es ist schwer, dass im Jahr 2016 SQL-Datenbanken noch so ein Grundzug Laking zu glauben ...

Antwort

2

Ich denke, die Antwort auf diese Frage ist so ziemlich das gleiche aus Ihrer vorherigen Frage. Verwenden Sie einfach die in Syntax von here.

aktualisieren

Um einen rohen SQL-Abfrage für Ihr Beispiel ausführen, können Sie die folgenden Befehle verwenden:

Ecto.Adapters.SQL.query(MyApp.Repo, "SELECT p.* FROM POSTS p WHERE p.TITLE IN ($1, $2)", ["title1", "title2"]) 
+0

Danke, ja, es ist möglich, mit Query DSL zu tun, aber immer noch - die Möglichkeit, Raw SQL auszuführen, scheint ziemlich fundamental für die SQL-Bibliothek zu sein. Ich würde gerne die Antwort sehen - wie es geht. –

+0

@AlexeyPetrushin aktualisiert die Antwort – JustMichael

+0

Aber wie man das Ergebnis in die Ansicht rendern, dh wie man 'Ecto.Adapters.SQL.query (MyApp.Repo, ..' 'Wie übergibt man das Ergebnis an die Ansicht? Danke . –

1

Wenn Sie Postgres verwenden Sie auch ANY verwenden können

Ecto.Adapters.SQL.query(
    Repo, 
    "SELECT p.* FROM posts p WHERE p.title = ANY($1)", 
    [["title1", "title2"]] 
) 

Und Postgres produziert die same query plan for In vs Any