/ / bestellen durch in Repo.preload - elixir, ecto

Bestellung von in Repo.Preload - Elixier, Ecto

Ich würde gerne in den von a Repo.preload, warum gibt es eine order by Klausel.

App.Repo.get(Sopitas.Continent, 1) |> App.Repo.preload(:countries)

Die ausgeführten Abfragen sind:

[debug] QUERY OK source="continents" db=0.4ms
SELECT c0.`id`, c0.`name`, c0.`sm_id`, c0.`inserted_at`, c0.`updated_at`
FROM `continents` AS c0 WHERE (c0.`id` = ?) [1]
[debug] QUERY OK source="countries" db=3.5ms decode=1.1ms
SELECT c0.`id`, c0.`sm_id`, c0.`name`, c0.`continent_id`, c0.`inserted_at`, c0.`updated_at`, c0.`continent_id`
FROM `countries` AS c0 WHERE (c0.`continent_id` = ?)
ORDER BY c0.`continent_id` [1]

Ich möchte verstehen, dass dieser Teil so weit ist, wie ich das verstehe order by Klausel fügt der Ausführung der Abfrage Verarbeitungszeit hinzu. Ich würde es vorziehen, das zu vermeiden order by.

Antworten:

1 für die Antwort № 1

Das liegt nicht an Repo.preload, das ist weil das so ist preload Abfrage gibt viele Datensätze zurück.

ORDER BY Klausel ist hinzugefügt von Ecto, um Länder (innerhalb der DB-Engine) effektiv zu gruppieren, bevor ein Großteil der Datensätze erzielt wird.

Der von mir bereitgestellte Link zeigt ein generisches Ecto Ansatz: Sobald die Abfrage viele Datensätze zurückgeben soll, müssen diese nach dem Schlüssel sortiert werden.


1 für die Antwort № 2

Wenn Sie Ihre Abfragefragmente erstellen, können Sie SQL-Klauselfunktionen auch mit Preload verwenden. Zum Beispiel:

alias App.Repo

Sopitas.Continent
|> Repo.get(1)
|> Repo.preload([countries: (from c in Country, order_by: c.<your_field_goes_here>)])

Es ist wirklich gut, offiziell zu studieren Dokumente ;)