2017-09-26 5 views
0

Ich bin neu in Postgresql JSONb und Ecto. Ich habe eine Tabelle mit einer Spalte "Konfiguration", die Jsonb ist. Ich bin in der Lage, einzufügen, aber wenn ich versuche, mit der Bedingung mit der Fragment-Funktion zu wählen, kann ich es nicht zum Funktionieren bringen. Hier ist Beispiel und Ausgang:Elixir Ecto JSONb Abfrage

iex> Repo.all(from i in Instance, select: i.configuration, where: 
fragment("?->'testing' LIKE '%hey%'", i.configuration)) 

[debug] QUERY ERROR source="instances" db=0.4ms 
SELECT i0."configuration" FROM "instances" AS i0 WHERE 
(i0."configuration"->'testing' LIKE '%hey%') [] 
** (Postgrex.Error) ERROR 42883 (undefined_function): operator does not 
exist: jsonb ~~ unknown 
(ecto) lib/ecto/adapters/sql.ex:431: 
Ecto.Adapters.SQL.execute_and_cache/7 
(ecto) lib/ecto/repo/queryable.ex:133: Ecto.Repo.Queryable.execute/5 
(ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4 

Wenn ich eine rohe Abfrage als solche auszuführen:

iex> query = """ 
select configuration FROM instances where configuration->>'testing' 
LIKE '%hey%' 
""" 
iex> Ecto.Adapters.SQL.query!(Repo, query) 
[debug] QUERY OK db=1.0ms 
select configuration FROM instances where configuration->>'testing' 
LIKE '%hey%' [] 
%Postgrex.Result{columns: ["configuration"], command: :select, 
connection_id: 28581, num_rows: 1, rows: [[%{"testing" => "some test 
hey?"}]]} 

Es arbeitet ebenfalls in psql die folgende Abfrage funktioniert:

select configuration FROM instances where configuration->>'tsting' LIKE '%hey%'; 

Jede Hilfe zu was ich falsch mache mit dem Repo.all (... Abfrage wäre zu schätzen, da ich einen Haufen vergeblich probiert habe und nicht verstehe was ich falsch mache.

Antwort

1

Ihre erste Abfrage verwendet die -> operator und verwendet wird:

Get Feld JSON-Objekt mit Schlüssel

so gibt es Sie jsonb zurück und der Fehler sagt Ihnen, dass es keine ~~ Operator (AKA LIKE), die eine jsonb auf der linken Seite dauert.

Die Abfrage, die funktioniert verwendet den ->> Operator, die text und LIKE (AKA ~~) gibt weiß, was mit text auf der linken Seite zu tun.

+0

Entlang des Weges hatte ich - >> an einem bestimmten Punkt und wahrscheinlich hatte einen anderen Fehler, zusätzlich zu nicht alle Dokumente zu lesen und den -> Operator zu verstehen. Ich schätze die Klarheit. – bexley

+0

Die Fehlermeldung, die über '~~' anstatt 'LIKE' spricht, ist verwirrend, es sei denn, Sie wissen bereits, dass' ~~ 'und' LIKE' dasselbe sind. Bitte. –