SQL ORM Mixins und Collections#
Modul: restalchemy.storage.sql.orm
Bietet ORM-ähnliche Funktionalität für DM-Modelle:
ObjectCollection— Collection-API, verfügbar alsModel.objects.SQLStorableMixin— Mixin, dassave(),update(),delete()und die Anbindung an SQL-Tabellen ergänzt.SQLStorableWithJSONFieldsMixin— Spezialisierung für Modelle mit JSON-Feldern.
ObjectCollection#
ObjectCollection implementiert die Collection-Schnittstelle für SQL-gestützte Modelle.
Wichtigste Methoden:
get_all(filters=None, session=None, cache=False, limit=None, order_by=None, locked=False)- Liefert eine Liste von Modellinstanzen.
- Nutzt
filters(DM-Filterstrukturen), um WHERE-Bedingungen zu bauen. - Kann mit
cache=Trueden Query-Cache der Session verwenden. get_one(filters=None, session=None, cache=False, locked=False)- Liefert genau eine Modellinstanz.
- Wirft
RecordNotFoundohne Treffer undHasManyRecordsbei mehr als einem Treffer. get_one_or_none(filters=None, session=None, cache=False, locked=False)- Liefert eine einzelne Instanz oder
None, wenn nichts gefunden wurde. query(where_conditions, where_values, session=None, cache=False, limit=None, order_by=None, locked=False)- Führt eine benutzerdefinierte WHERE-Bedingung aus.
count(session=None, filters=None)- Liefert die Anzahl der Zeilen, die den Filtern entsprechen.
ObjectCollection verwendet:
- Den SQL-Dialekt über
engine.dialect. - Die Methode
restore_from_storage()des Modells, um Zeilen in DM-Modelle zu überführen.
Laden von Beziehungen#
Eine Beziehung, die die Abfrage nicht vorab geladen hat (prefetch), kommt als
Bezeichner an, und das Modell, das er benennt, wird separat gelesen.
get_all() und query() sammeln die Bezeichner der gesamten Seite und lesen
sie mit einer Abfrage pro Beziehung statt mit einer Abfrage pro Zeile; mit dem,
worauf diese Objekte ihrerseits zeigen, verfahren sie ebenso.
- Zeilen der Seite, die dasselbe Objekt benennen, erhalten dieselbe Instanz.
- Ein Bezeichner, den die Seite nicht findet, bleibt unverändert, sodass eine Zeile, die auf einen fehlenden Datensatz zeigt, genauso scheitert wie zuvor.
- Eine mit
prefetch=Truedeklarierte Beziehung wird von der Abfrage gelesen, die die Seite liest (einLEFT JOIN), und ist hiervon nicht betroffen. SQLStorableMixin.RELATIONSHIP_BATCH_SIZE(standardmäßig 1000) begrenzt, wie viele Bezeichner eine einzelne Abfrage anfordert.
SQLStorableMixin#
SQLStorableMixin ist dafür gedacht, mit DM-Modellen kombiniert zu werden, um sie in SQL speicherbar zu machen.
Voraussetzungen#
- Das DM-Modell muss einen gültigen
__tablename__-String besitzen. - Es muss mindestens eine ID-Property geben (
id_property=True).
Kernaufgaben#
get_table()- Liefert eine
SQLTable-Instanz für das Modell, zwischengespeichert in__operational_storage__. insert(session=None)- Fügt das Modell mit den aktuellen Property-Werten in die Tabelle ein.
- Übersetzt dialektspezifische Exceptions in Storage-Exceptions (z. B. Konflikte).
save(session=None)- Ruft
insert()auf, wenn die Instanz noch nicht gespeichert ist. - Andernfalls ruft es
update()auf. update(session=None, force=False)- Aktualisiert die Zeile, wenn das Modell verändert wurde oder
force=Truegesetzt ist. - Validiert das Modell vor dem Update.
- Stellt sicher, dass genau eine Zeile aktualisiert wird (sonst wird eine Exception geworfen).
delete(session=None)- Löscht die Zeile, die den ID-Properties des Modells entspricht.
restore_from_storage(**kwargs)(Klassenmethode)- Konvertiert Zeilenwerte der Datenbank (einfache Typen) in DM-Property-Werte.
- Erzeugt eine Modellinstanz, die als gespeichert markiert ist.
Anbindung der Object Collection#
SQLStorableMixin definiert _ObjectCollection = ObjectCollection. In Kombination mit den Basis-Storage-Klassen ergibt das:
Model.objects— eine Collection, die Abfragen überObjectCollectionausführt.
Hilfsfunktionen zur Typkonvertierung#
to_simple_type(value)(Klassenmethode)- Konvertiert Modellinstanzen oder rohe ID-Werte in eine für Filter geeignete Form.
from_simple_type(value)(Klassenmethode)- Konvertiert rohe ID-Werte oder Prefetch-Ergebnisse in Modellinstanzen.
Diese Helfer erlauben es Storage- und API-Schicht, transparent mit IDs und Prefetch-Strukturen zu arbeiten.
SQLStorableWithJSONFieldsMixin#
SQLStorableWithJSONFieldsMixin erweitert SQLStorableMixin für Datenbanken, die JSON-Felder nicht nativ unterstützen.
Verwendungsmuster:
- Erben Sie von
SQLStorableWithJSONFieldsMixinstatt vonSQLStorableMixin. - Definieren Sie
__jsonfields__als Iterable der Feldnamen, die JSON-Daten enthalten.
Verhalten:
restore_from_storage()- Für Felder aus
__jsonfields__:- Ist der gespeicherte Wert ein String, wird er als JSON geparst.
_get_prepared_data(properties=None)- Für Felder aus
__jsonfields__werden Python-Datenstrukturen als kompakte JSON-Strings serialisiert.
So können Sie JSON-Felder in Ihren DM-Modellen behalten und sie in Datenbanken ohne native JSON-Unterstützung als Text persistieren.