2017-05-12 7 views
0

Ich bin gerade dabei, eine Knoten-App in Elixir zu konvertieren und einige Abfragen zu haben, für die ich Ecto verwenden möchte, aber ich habe keinen Weg gefunden, der funktioniert und möchte es unterlassen aus Strings und Argumenten, wenn möglich, verketten.Verwendung von Elixir - Ecto für komplexe Abfragen

Ich habe etwa 10 Abfragen, die innerhalb einer Transaktion verkettet sind, die etwas wie folgt aussehen:

INSERT INTO user_servers(user_id, server_id, server_type_code,  position,     active_flag, create_date,  created_by) 
       SELECT ?,   ?,  'SERVER',  (COALESCE(MAX(position), 0) + 1),  'Y',  CURRENT_TIMESTAMP,  ? 
                     FROM user_servers WHERE server_type_code = 'SERVER' and user_id = ?; 

Dies ist innerhalb einer Transaktion.

Also meine erste Frage ist, wie ich wirklich kämpfen, herauszufinden, die richtige Kombination in ecto nur diese Abfrage zu tun.

Wie kann ich eine INSERT mit einer SELECT-Klausel in Ecto tun und in der Lage sein, die Fragezeichen durch hartcodierte Elemente zu ersetzen.

Ich benutze Schneeflocke, um IDs zu erstellen, so wird diese IDs Server-Seite erstellen und senden sie durch.

Meine nächste Frage ist, wie kann ich Repo.transaction mit multi.new mit Raw SQL verwenden.

Antwort

2

Ich glaube, dass Sie die rohe query/4 API verwenden möchten. Dadurch können Sie eine benutzerdefinierte Abfrage schreiben und haben den Vorteil, dass Sie Ihre Eingabe nicht verlassen müssen. So etwas wie das Folgende sollte funktionieren.

raw_query = "INSERT INTO user_servers(user_id, server_id, server_type_code, position, active_flag, create_date, created_by) 
      SELECT $1, $2, 'SERVER', (COALESCE(MAX(position), 0) + 1), 'Y', CURRENT_TIMESTAMP, $3 
      FROM user_servers WHERE server_type_code = 'SERVER' and user_id = $4;" 

Ecto.Adapters.SQL.query(MyRepo, raw_query, [value1, value2, value3, value4]) 
Verwandte Themen