Merkmale und Philosophie

Eine Übersicht, worum es bei SQLAlchemy geht.

Hauptfunktionen von SQLAlchemy

Einige der Hauptfunktionen im Überblick

Kein ORM erforderlich

SQLAlchemy besteht aus zwei unterschiedlichen Komponenten, bekannt als das Core und das ORM. Das Core ist selbst ein voll ausgestattetes SQL-Abstraktions-Toolkit, das eine reibungslose Abstraktionsebene über eine Vielzahl von DBAPI-Implementierungen und -Verhaltensweisen bietet, sowie eine SQL Expression Language, die die Ausdrucksweise der SQL-Sprache über generative Python-Ausdrücke ermöglicht. Ein Schemadarstellungssystem, das sowohl DDL-Anweisungen ausgeben als auch vorhandene Schemata introspektieren kann, und ein Typsystem, das jede Zuordnung von Python-Typen zu Datenbanktypen ermöglicht, runden das System ab. Der Object Relational Mapper ist dann ein optionales Paket, das auf dem Core aufbaut. Viele Anwendungen werden ausschließlich auf dem Core aufgebaut, wobei das SQL-Ausdruckssystem für präzise und exakte Kontrolle über Datenbankinteraktionen verwendet wird.

Ausgereifte, leistungsstarke Architektur

Über sieben Jahre kontinuierliche Entwicklung, Profiling und Refactoring haben zu einem Toolkit geführt, das leistungsstark und genau ist, gut getestet und in Tausenden von Umgebungen eingesetzt wird. Mit praktisch jeder Hauptkomponente in ihrer zweiten oder dritten vollständigen Iteration ist SQLAlchemy 0.6 etwa doppelt so schnell wie ältere 0.4-Versionen von vor nur wenigen Jahren, und die Versionen 0.7 und 0.8 verbessern sich weiter. Seine reine Ausführungsgeschwindigkeit ist konkurrenzfähig mit vergleichbaren Tools, und fortschrittliche ORM-Funktionen wie die Unit of Work, In-Memory-Collections, Eager Loading von Collections über Joins oder sekundäre Subqueries und andere Optimierungen ermöglichen es dem SQLAlchemy ORM, weniger und effizientere Abfragen als in jeder früheren Version auszugeben.

DBA-genehmigt

Entwickelt nach den Anforderungen von DBAs, einschließlich der Möglichkeit, generierte SQL-Abfragen durch handoptimierte Anweisungen zu ersetzen, vollständige Verwendung von Bindungsparametern für alle Literale, vollständig transaktionalisierte und gebündelte Datenbank-Schreibvorgänge mit dem Unit of Work-Muster. Alle objektrelationalen Muster sind um die Nutzung ordnungsgemäßer referenzieller Integrität herum konzipiert, und Fremdschlüssel sind ein integraler Bestandteil seiner Verwendung.

Nicht-meinungsbildend

SQLAlchemy legt größten Wert darauf, der Datenbank- und Anwendungsarchitektur nicht im Wege zu stehen. Im Gegensatz zu vielen Tools "generiert" es **niemals** Schemata (nicht zu verwechseln mit der Ausgabe benutzerdefinierter DDL, bei der es hervorragend ist) oder verlässt sich auf Namenskonventionen jeglicher Art. SQLAlchemy unterstützt die größtmögliche Vielfalt an Datenbank- und Architekturentwürfen.

Unit Of Work

Das Unit of Work-System, ein zentraler Bestandteil des SQLAlchemy Object Relational Mappers (ORM), organisiert ausstehende Einfüge-/Aktualisierungs-/Löschoperationen in Warteschlangen und leert sie alle in einem einzigen Batch. Um dies zu erreichen, führt es eine topologische "Abhängigkeitssortierung" aller modifizierten Elemente in der Warteschlange durch, um Zeilenabhängigkeiten zu berücksichtigen, und gruppiert redundante Anweisungen, wo diese manchmal noch weiter gebündelt werden können. Dies sorgt für maximale Effizienz und Transaktionssicherheit und minimiert die Gefahr von Deadlocks. Modelliert nach Fowlers "Unit of Work"-Muster sowie Hibernate, dem führenden Java-Objektrelationalen Mapper.

Funktionsbasierte Abfragekonstruktion

Funktionsbasierte Abfragekonstruktion ermöglicht den Aufbau von SQL-Klauseln über Python-Funktionen und -Ausdrücke. Die volle Bandbreite der Möglichkeiten umfasst boolesche Ausdrücke, Operatoren, Funktionen, Tabellen-Aliase, auswählbare Subqueries, Insert-/Update-/Delete-Anweisungen, korrelierte Updates, Selects und EXISTS-Klauseln, UNION-Klauseln, innere und äußere Joins, Bindungsparameter und das freie Mischen von literalen Texten innerhalb von Ausdrücken. Konstruierte Ausdrücke sind spezifisch für eine beliebige Anzahl von Vendor-Datenbankimplementierungen (wie PostgreSQL oder Oracle) kompilierbar, bestimmt durch die Kombination eines "Dialekts" und "Compilers", die von der Implementierung bereitgestellt werden.

Modular und erweiterbar

Verschiedene Teile von SQLAlchemy können unabhängig voneinander verwendet werden. Elemente wie Connection Pooling, SQL-Anweisungskompilierung und Transaktionsdienste können unabhängig voneinander verwendet und auch über verschiedene Plugin-Punkte erweitert werden. Ein integriertes Ereignissystem ermöglicht die Injektion von benutzerdefiniertem Code an über fünfzig Interaktionspunkten, einschließlich der Kernanweisungsausführung, Schemaerzeugung und -inspektion, Connection Pool-Operationen, objektrelationaler Konfiguration, Persistenzoperationen, Attributmutationsereignissen und Transaktionsphasen. Neue SQL-Ausdruckselemente und benutzerdefinierte Datenbanktypen können nahtlos erstellt und integriert werden.

Getrennte Mapping- und Klassendesigns

Das ORM standardisiert auf ein "deklaratives" Konfigurationssystem, das die Erstellung benutzerdefinierter Klassen inline mit den Tabellenmetadaten, denen sie zugeordnet werden, ermöglicht, so wie es die meisten anderen objektrelationalen Tools bieten. Dieses System ist jedoch völlig optional – im Kern betrachtet das ORM die benutzerdefinierte Klasse, die zugehörigen Tabellenmetadaten und die Zuordnung der beiden als vollständig getrennt. Durch die Verwendung der Funktion mapper() kann jede beliebige Python-Klasse einer Datenbanktabelle oder -ansicht zugeordnet werden. Gemappte Klassen behalten auch die Serialisierbarkeit (Pickling) für die Verwendung in verschiedenen Caching-Systemen.

Eager-Loading und Caching von zugehörigen Objekten und Sammlungen

Das ORM cacht Sammlungen und Referenzen zwischen Objekten, sobald sie geladen sind, sodass bei jedem Zugriff keine SQL-Abfrage gesendet werden muss. Die Eager-Loading-Funktion ermöglicht das Laden ganzer Objektgraphen, die durch Sammlungen und Referenzen verbunden sind, mit wenigen oder nur einer einzigen Abfrage. Dies kann bis zur genauen Anzahl der Anweisungen pro Mapping oder pro Abfrage konfiguriert werden, ohne Änderungen an bestehenden Abfragen vornehmen zu müssen. Das "N+1"-Problem, bei dem ein ORM für alle Objekte in einer Sammlung einzelne Anweisungen ausgeben muss, gehört mit SQLAlchemy der Vergangenheit an.

Zusammengesetzte (mehrspaltige) Primärschlüssel

In SQLAlchemy werden Primär- und Fremdschlüssel als Spaltensätze dargestellt; ein echtes zusammengesetztes Verhalten ist von Grund auf implementiert. Das ORM verfügt über eine industrielle Unterstützung für aussagekräftige (nicht-surrogat) Primärschlüssel, einschließlich Mutabilität und Kompatibilität mit ON UPDATE CASCADE, sowie explizite Unterstützung für andere gängige zusammengesetzte PK-Muster wie "Assoziations"-Objekte (Many-to-Many-Beziehungen mit zusätzlichem Bedeutungsgehalt für jede Assoziation).

Selbstreferenzielle Objekt-Mappings

Selbstreferenzielle Mappings werden vom ORM unterstützt. Adjazenzlistenstrukturen können mit ordnungsgemäßer Kaskadierung erstellt, gespeichert und gelöscht werden, ohne zusätzlichen Codeaufwand über den von nicht-selbstreferenziellen Strukturen hinaus. Das Laden von selbstreferenziellen Strukturen beliebiger Tiefe kann so optimiert werden, dass Sammlungen rekursiv über eine einzige Anweisung mit einer Reihe von Joins (d. h. ein joinedload) geladen werden, oder über mehrere Anweisungen, bei denen jede den vollständigen Satz von Datensätzen auf einer bestimmten tiefen Ebene lädt (d. h. subqueryload). Die Persistenz mit Tabellen, die gegenseitig abhängige Fremdschlüsselpaare aufweisen (d. h. "viele x"/"ein bestimmtes x"), wird ebenfalls nativ mit der Funktion "Post Update" unterstützt.

Vererbungsmuster
Explizite Unterstützung ist für Single-Table-, Concrete-Table- und Joined-Table-Vererbung verfügbar. Polymorphes Laden (d. h. eine Abfrage, die Objekte mehrerer abgeleiteter Typen zurückgibt) wird für alle drei Stile unterstützt. Das Laden jedes einzelnen kann optimiert werden, sodass nur ein einziger Rundgang zum vollständigen Laden eines polymorphen Ergebnissatzes verwendet wird.
Mapping von Roh-SQL-Anweisungen

Die objektrelationalen Abfragefunktionen von SQLA können Roh-SQL-Anweisungen sowie einfache Ergebnissets verarbeiten, und Objektinstanzen können aus diesen Ergebnissen auf die gleiche Weise generiert werden wie bei jeder anderen ORM-Operation. Jede hyperoptimierte Abfrage, die Sie oder Ihr DBA erstellen können, können Sie in SQLAlchemy ausführen, und solange sie die erwarteten Spalten innerhalb eines Rowsets zurückgibt, erhalten Sie Ihre Objekte daraus. Anweisungen, die mehrere Arten von Objekten darstellen, können ebenfalls verwendet werden, mit Ergebnissen, die als benannte Tupel empfangen werden, oder mit abhängigen Objekten, die in Sammlungen auf übergeordneten Objekten weitergeleitet werden.

Vor- und Nachverarbeitung von Daten

Das Typsystem ermöglicht die Vor- und Nachverarbeitung von Daten sowohl auf der Ebene der Bindungsparameter als auch der Ergebnissets. Benutzerdefinierte Typen können frei mit integrierten Typen gemischt werden. Generische Typen sowie SQL-spezifische Typen sind verfügbar.

Unterstützte Plattformen

SQLAlchemy unterstützt Python 3.7+ und Pypy.

Unterstützte Datenbanken

SQLAlchemy umfasst Dialekte für SQLite, Postgresql, MySQL & MariaDB, Oracle und MS-SQL, von denen die meisten mehrere DBAPIs unterstützen. SQLAlchemy unterstützt sowohl synchrone als auch asynchrone Treiber, was die Verwendung mit asyncio ermöglicht. Andere Dialekte werden als externe Projekte veröffentlicht. Die entsprechende DB-API 2.0-Implementierung (oder manchmal eine von mehreren verfügbaren) ist erforderlich, um jede spezifische Datenbank zu verwenden. Aktuelle DBAPI-Unterstützung anzeigen