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.
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
Die Fehlermeldung, die über '~~' anstatt 'LIKE' spricht, ist verwirrend, es sei denn, Sie wissen bereits, dass' ~~ 'und' LIKE' dasselbe sind. Bitte. –