SQLAlchemy 2.0 Dokumentation
SQLAlchemy ORM
- ORM Schnellstart
- ORM Abgebildete Klassenkonfiguration
- Beziehungskonfiguration
- ORM Abfragehandbuch
- Schreiben von SELECT-Anweisungen für ORM-zugeordnete Klassen
- Schreiben von SELECT-Anweisungen für Vererbungszuordnungen
- ORM-aktivierte INSERT-, UPDATE- und DELETE-Anweisungen
- Spaltenladeoptionen
- Techniken für das Laden von Beziehungen
- ORM-API-Funktionen für Abfragen
- Legacy Query API¶
- Das Query-Objekt
QueryQuery.__init__()Query.add_column()Query.add_columns()Query.add_entity()Query.all()Query.apply_labels()Query.as_scalar()Query.autoflush()Query.column_descriptionsQuery.correlate()Query.count()Query.cte()Query.delete()Query.distinct()Query.enable_assertions()Query.enable_eagerloads()Query.except_()Query.except_all()Query.execution_options()Query.exists()Query.filter()Query.filter_by()Query.first()Query.from_statement()Query.get()Query.get_children()Query.get_execution_options()Query.get_label_styleQuery.group_by()Query.having()Query.instances()Query.intersect()Query.intersect_all()Query.is_single_entityQuery.join()Query.label()Query.lazy_loaded_fromQuery.limit()Query.merge_result()Query.offset()Query.one()Query.one_or_none()Query.only_return_tuples()Query.options()Query.order_by()Query.outerjoin()Query.params()Query.populate_existing()Query.prefix_with()Query.reset_joinpoint()Query.scalar()Query.scalar_subquery()Query.select_from()Query.selectableQuery.set_label_style()Query.slice()Query.statementQuery.subquery()Query.suffix_with()Query.tuples()Query.union()Query.union_all()Query.update()Query.value()Query.values()Query.where()Query.whereclauseQuery.with_entities()Query.with_for_update()Query.with_hint()Query.with_labels()Query.with_parent()Query.with_session()Query.with_statement_hint()Query.with_transformation()Query.yield_per()
- ORM-spezifische Query-Konstrukte
- Das Query-Objekt
- Verwendung der Sitzung
- Ereignisse und Interna
- ORM Erweiterungen
- ORM Beispiele
Projektversionen
- Vorheriger: ORM API Features für Abfragen
- Nächster: Verwendung der Session
- Oben: Startseite
- Auf dieser Seite
- Legacy Query API
- Das Query-Objekt
QueryQuery.__init__()Query.add_column()Query.add_columns()Query.add_entity()Query.all()Query.apply_labels()Query.as_scalar()Query.autoflush()Query.column_descriptionsQuery.correlate()Query.count()Query.cte()Query.delete()Query.distinct()Query.enable_assertions()Query.enable_eagerloads()Query.except_()Query.except_all()Query.execution_options()Query.exists()Query.filter()Query.filter_by()Query.first()Query.from_statement()Query.get()Query.get_children()Query.get_execution_options()Query.get_label_styleQuery.group_by()Query.having()Query.instances()Query.intersect()Query.intersect_all()Query.is_single_entityQuery.join()Query.label()Query.lazy_loaded_fromQuery.limit()Query.merge_result()Query.offset()Query.one()Query.one_or_none()Query.only_return_tuples()Query.options()Query.order_by()Query.outerjoin()Query.params()Query.populate_existing()Query.prefix_with()Query.reset_joinpoint()Query.scalar()Query.scalar_subquery()Query.select_from()Query.selectableQuery.set_label_style()Query.slice()Query.statementQuery.subquery()Query.suffix_with()Query.tuples()Query.union()Query.union_all()Query.update()Query.value()Query.values()Query.where()Query.whereclauseQuery.with_entities()Query.with_for_update()Query.with_hint()Query.with_labels()Query.with_parent()Query.with_session()Query.with_statement_hint()Query.with_transformation()Query.yield_per()
- ORM-spezifische Query-Konstrukte
- Das Query-Objekt
Legacy Query API¶
Über die Legacy Query API
Diese Seite enthält die Python-generierte Dokumentation für das Konstrukt Query, das viele Jahre lang die einzige SQL-Schnittstelle bei der Arbeit mit SQLAlchemy ORM war. Ab Version 2.0 ist ein völlig neuer Arbeitsansatz der Standard, bei dem das gleiche select()-Konstrukt, das für Core funktioniert, auch für ORM gut funktioniert und eine konsistente Schnittstelle zum Erstellen von Abfragen bietet.
Für jede Anwendung, die vor der API von Version 2.0 auf SQLAlchemy ORM aufgebaut ist, stellt die Query API normalerweise den Großteil des Datenbankzugriffscodes innerhalb einer Anwendung dar. Daher wird der Großteil der Query API **nicht aus SQLAlchemy entfernt**. Das Query-Objekt übersetzt sich im Hintergrund selbst in ein select()-Objekt im Stil von 2.0, wenn das Query-Objekt ausgeführt wird, sodass es jetzt nur noch eine sehr dünne Adapter-API ist.
Einen Leitfaden zur Migration einer auf Query basierenden Anwendung auf den Stil von 2.0 finden Sie unter 2.0 Migration - ORM-Nutzung.
Für eine Einführung in das Schreiben von SQL für ORM-Objekte im Stil von 2.0 beginnen Sie mit dem SQLAlchemy Unified Tutorial. Zusätzliche Referenzen für Abfragen im Stil von 2.0 finden Sie unter ORM Querying Guide.
Das Query-Objekt¶
Query wird im Kontext einer gegebenen Session mithilfe der Methode Session.query() erstellt.
q = session.query(SomeMappedClass)Im Folgenden finden Sie die vollständige Schnittstelle für das Query-Objekt.
| Objektname | Beschreibung |
|---|---|
SQL-Konstruktionsobjekt auf ORM-Ebene. |
- class sqlalchemy.orm.Query¶
SQL-Konstruktionsobjekt auf ORM-Ebene.
Legacy-Funktion
Das ORM
Query-Objekt ist ab SQLAlchemy 2.0 ein Legacy-Konstrukt. Sehen Sie die Hinweise oben auf Legacy Query API für einen Überblick, einschließlich Links zur Migrationsdokumentation.Query-Objekte werden normalerweise zunächst über die MethodeSession.query()einerSessiongeneriert, und in selteneren Fällen durch direkte Instanziierung vonQueryund Verknüpfung mit einerSessionüber die MethodeQuery.with_session().Mitglieder
__init__(), add_column(), add_columns(), add_entity(), all(), apply_labels(), as_scalar(), autoflush(), column_descriptions, correlate(), count(), cte(), delete(), distinct(), enable_assertions(), enable_eagerloads(), except_(), except_all(), execution_options(), exists(), filter(), filter_by(), first(), from_statement(), get(), get_children(), get_execution_options(), get_label_style, group_by(), having(), instances(), intersect(), intersect_all(), is_single_entity, join(), label(), lazy_loaded_from, limit(), merge_result(), offset(), one(), one_or_none(), only_return_tuples(), options(), order_by(), outerjoin(), params(), populate_existing(), prefix_with(), reset_joinpoint(), scalar(), scalar_subquery(), select_from(), selectable, set_label_style(), slice(), statement, subquery(), suffix_with(), tuples(), union(), union_all(), update(), value(), values(), where(), whereclause, with_entities(), with_for_update(), with_hint(), with_labels(), with_parent(), with_session(), with_statement_hint(), with_transformation(), yield_per()
Klassensignatur
class
sqlalchemy.orm.Query(sqlalchemy.sql.expression._SelectFromElements,sqlalchemy.sql.annotation.SupportsCloneAnnotations,sqlalchemy.sql.expression.HasPrefixes,sqlalchemy.sql.expression.HasSuffixes,sqlalchemy.sql.expression.HasHints,sqlalchemy.event.registry.EventTarget,sqlalchemy.log.Identified,sqlalchemy.sql.expression.Generative,sqlalchemy.sql.expression.Executable,typing.Generic)-
method
sqlalchemy.orm.Query.__init__(entities: _ColumnsClauseArgument[Any] | Sequence[_ColumnsClauseArgument[Any]], session: Session | None = None)¶ Erstellen Sie eine
Querydirekt.Z. B.
q = Query([User, Address], session=some_session)Das Obige ist äquivalent zu
q = some_session.query(User, Address)
-
method
sqlalchemy.orm.Query.add_column(column: _ColumnExpressionArgument[Any]) → Query[Any]¶ Fügt einen Spaltenausdruck zur Liste der zurückzugebenden Ergebnisspalten hinzu.
Veraltet seit Version 1.4:
Query.add_column()ist veraltet und wird in einer zukünftigen Version entfernt. Bitte verwenden SieQuery.add_columns()
-
method
sqlalchemy.orm.Query.add_columns(*column: _ColumnExpressionArgument[Any]) → Query[Any]¶ Fügt einen oder mehrere Spaltenausdrücke zur Liste der zurückzugebenden Ergebnisspalten hinzu.
Siehe auch
Select.add_columns()- mit Version 2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.add_entity(entity: _EntityType[Any], alias: Alias | Subquery | None = None) → Query[Any]¶ Fügt eine gemappte Entität zur Liste der zurückzugebenden Ergebnisspalten hinzu.
Siehe auch
Select.add_columns()- mit Version 2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.all() → List[_T]¶ Gibt die von dieser
Querydargestellten Ergebnisse als Liste zurück.Dies führt zur Ausführung der zugrunde liegenden SQL-Anweisung.
Warnung
Das
Query-Objekt wird, wenn es gebeten wird, eine Sequenz oder einen Iterator zurückzugeben, der vollständige ORM-gemappte Entitäten enthält, **Einträge anhand des Primärschlüssels deduplizieren**. Weitere Details finden Sie in den FAQs.Siehe auch
Result.all()- mit Version 2 vergleichbare Methode.Result.scalars()- mit Version 2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.apply_labels() → Self¶ Veraltet seit Version 2.0: Die Methoden
Query.with_labels()undQuery.apply_labels()gelten seit der 1.x-Reihe von SQLAlchemy als Legacy und werden in 2.0 zu Legacy-Konstrukten. Verwenden Sie stattdessen set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL).
-
method
sqlalchemy.orm.Query.as_scalar() → ScalarSelect[Any]¶ Gibt die vollständige SELECT-Anweisung, die von dieser
Queryrepräsentiert wird, als skalare Unterabfrage zurück.Veraltet seit Version 1.4: Die Methode
Query.as_scalar()ist veraltet und wird in einer zukünftigen Version entfernt. Bitte beachten SieQuery.scalar_subquery().
-
method
sqlalchemy.orm.Query.autoflush(setting: bool) → Self¶ Gibt eine Query mit einer bestimmten „autoflush“-Einstellung zurück.
Ab SQLAlchemy 1.4 ist die Methode
Query.autoflush()äquivalent zur Verwendung der Ausführungsoptionautoflushauf ORM-Ebene. Weitere Informationen zu dieser Option finden Sie im Abschnitt Autoflush.
-
attribute
sqlalchemy.orm.Query.column_descriptions¶ Gibt Metadaten zu den Spalten zurück, die von dieser
Queryzurückgegeben würden.Das Format ist eine Liste von Dictionaries.
user_alias = aliased(User, name="user2") q = sess.query(User, User.id, user_alias) # this expression: q.column_descriptions # would return: [ { "name": "User", "type": User, "aliased": False, "expr": User, "entity": User, }, { "name": "id", "type": Integer(), "aliased": False, "expr": User.id, "entity": User, }, { "name": "user2", "type": User, "aliased": True, "expr": user_alias, "entity": user_alias, }, ]
Siehe auch
Diese API ist auch mit Abfragen im Stil von 2.0 verfügbar, dokumentiert unter
-
method
sqlalchemy.orm.Query.correlate(*fromclauses: Literal[None, False] | FromClauseRole | Type[Any] | Inspectable[_HasClauseElement[Any]] | _HasClauseElement[Any]) → Self¶ Gibt ein
Query-Konstrukt zurück, das die gegebenen FROM-Klauseln mit denen einer umschließendenQueryoderselect()korreliert.Die Methode hier akzeptiert zugeordnete Klassen,
aliased()-Konstrukte undMapper-Konstrukte als Argumente, die in Ausdruckskonstrukte aufgelöst werden, zusätzlich zu entsprechenden Ausdruckskonstrukten.Die Korrelationsargumente werden letztendlich an
Select.correlate()übergeben, nachdem sie in Ausdruckskonstrukte umgewandelt wurden.Die Korrelationsargumente werden wirksam in Fällen, in denen
Query.from_self()verwendet wird, oder wenn eine Unterabfrage, wie sie vonQuery.subquery()zurückgegeben wird, in ein anderesselect()-Konstrukt eingebettet ist.Siehe auch
Select.correlate()- V2-äquivalente Methode.
-
method
sqlalchemy.orm.Query.count() → int¶ Gibt die Anzahl der Zeilen zurück, die die von dieser
Querygebildete SQL-Abfrage zurückgeben würde.Dies generiert die SQL für diese Query wie folgt
SELECT count(1) AS count_1 FROM ( SELECT <rest of query follows...> ) AS anon_1
Die obige SQL-Abfrage gibt eine einzelne Zeile zurück, die den aggregierten Wert der COUNT-Funktion darstellt; die Methode
Query.count()gibt dann diesen einzelnen ganzzahligen Wert zurück.Warnung
Es ist wichtig zu beachten, dass der von count() zurückgegebene Wert *nicht dasselbe ist wie die Anzahl der ORM-Objekte, die diese Query mit einer Methode wie .all() zurückgeben würde*. Das
Query-Objekt dedupliziert Einträge basierend auf dem Primärschlüssel, wenn es angewiesen wird, vollständige Entitäten zurückzugeben, was bedeutet, dass, wenn derselbe Primärschlüsselwert mehrmals in den Ergebnissen vorkommt, nur ein Objekt dieses Primärschlüssels vorhanden ist. Dies gilt nicht für Abfragen, die auf einzelne Spalten abzielen.Für eine detaillierte Steuerung spezifischer Spalten zum Zählen, um die Verwendung einer Unterabfrage zu überspringen oder die FROM-Klausel anderweitig zu steuern, oder um andere Aggregatfunktionen zu verwenden, verwenden Sie
expression.func-Ausdrücke in Verbindung mitSession.query(), d. h.from sqlalchemy import func # count User records, without # using a subquery. session.query(func.count(User.id)) # return count of user "id" grouped # by "name" session.query(func.count(User.id)).group_by(User.name) from sqlalchemy import distinct # count distinct "name" values session.query(func.count(distinct(User.name)))
Siehe auch
-
method
sqlalchemy.orm.Query.cte(name: str | None = None, recursive: bool = False, nesting: bool = False) → CTE¶ Gibt die vollständige SELECT-Anweisung, die von dieser
Querydargestellt wird, als Common Table Expression (CTE) zurück.Parameter und Verwendung sind identisch mit denen der Methode
SelectBase.cte(). Weitere Details finden Sie dort.Hier ist das PostgreSQL WITH RECURSIVE Beispiel. Beachten Sie, dass in diesem Beispiel die CTE
included_partsund ihr Aliasincl_aliasCore-Selectables sind, was bedeutet, dass auf die Spalten über das Attribut.c.zugegriffen wird. Das Objektparts_aliasist eine Instanz vonaliased()der EntitätPart, sodass spaltenzugeordnete Attribute direkt verfügbar sind.from sqlalchemy.orm import aliased class Part(Base): __tablename__ = "part" part = Column(String, primary_key=True) sub_part = Column(String, primary_key=True) quantity = Column(Integer) included_parts = ( session.query(Part.sub_part, Part.part, Part.quantity) .filter(Part.part == "our part") .cte(name="included_parts", recursive=True) ) incl_alias = aliased(included_parts, name="pr") parts_alias = aliased(Part, name="p") included_parts = included_parts.union_all( session.query( parts_alias.sub_part, parts_alias.part, parts_alias.quantity ).filter(parts_alias.part == incl_alias.c.sub_part) ) q = session.query( included_parts.c.sub_part, func.sum(included_parts.c.quantity).label("total_quantity"), ).group_by(included_parts.c.sub_part)
Siehe auch
Select.cte()- V2-äquivalente Methode.
-
method
sqlalchemy.orm.Query.delete(synchronize_session: SynchronizeSessionArgument = 'auto', delete_args: Dict[Any, Any] | None = None) → int¶ Führt ein DELETE mit einer beliebigen WHERE-Klausel durch.
Löscht Zeilen, die von dieser Abfrage gefunden wurden, aus der Datenbank.
Z. B.
sess.query(User).filter(User.age == 25).delete(synchronize_session=False) sess.query(User).filter(User.age == 25).delete( synchronize_session="evaluate" )
Warnung
Siehe den Abschnitt ORM-aktivierte INSERT-, UPDATE- und DELETE-Anweisungen für wichtige Hinweise und Warnungen, einschließlich Einschränkungen bei der Verwendung von Massen-UPDATEs und -DELETEs mit Mapper-Vererbungskonfigurationen.
- Parameter:
synchronize_session¶ – wählt die Strategie zur Aktualisierung der Attribute von Objekten in der Sitzung. Siehe den Abschnitt ORM-aktivierte INSERT-, UPDATE- und DELETE-Anweisungen für eine Erörterung dieser Strategien.
delete_args¶ –
Optionales Wörterbuch, das, falls vorhanden, an das zugrunde liegende
delete()-Konstrukt als**kwfür das Objekt übergeben wird. Kann verwendet werden, um dialektspezifische Argumente wiemysql_limitzu übergeben.Neu in Version 2.0.37.
- Gibt zurück:
die Anzahl der gefundenen Zeilen, wie sie von der „Zeilenanzahl“-Funktion der Datenbank zurückgegeben wird.
-
method
sqlalchemy.orm.Query.distinct(*expr: _ColumnExpressionArgument[Any]) → Self¶ Wendet ein
DISTINCTauf die Abfrage an und gibt die neu resultierendeQueryzurück.Hinweis
Der
distinct()-Aufruf auf ORM-Ebene enthält Logik, die automatisch Spalten aus der ORDER BY-Klausel der Abfrage zur Spaltenklausel der SELECT-Anweisung hinzufügt, um den gängigen Bedarf des Datenbank-Backends zu erfüllen, dass ORDER BY-Spalten Teil der SELECT-Liste sind, wenn DISTINCT verwendet wird. Diese Spalten werden jedoch *nicht* zur Liste der tatsächlich von derQueryabgerufenen Spalten hinzugefügt, beeinflussen also die Ergebnisse nicht. Die Spalten werden jedoch bei Verwendung desQuery.statement-Accessors weitergegeben.Veraltet seit Version 2.0: Diese Logik ist veraltet und wird in SQLAlchemy 2.0 entfernt. Siehe Verwendung von DISTINCT mit zusätzlichen Spalten, aber nur die Entität auswählen für eine Beschreibung dieses Anwendungsfalls in 2.0.
Siehe auch
Select.distinct()- V2-äquivalente Methode.- Parameter:
*expr¶ –
optionale Spaltenausdrücke. Wenn vorhanden, rendert der PostgreSQL-Dialekt ein
DISTINCT ON (<expressions>)-Konstrukt.Veraltet seit Version 1.4: Die Verwendung von *expr in anderen Dialekten ist veraltet und wird in einer zukünftigen Version
CompileErrorauslösen.
-
method
sqlalchemy.orm.Query.enable_assertions(value: bool) → Self¶ Steuert, ob Assertions generiert werden.
Wenn auf False gesetzt, wird die zurückgegebene Query ihren Zustand vor bestimmten Operationen nicht überprüfen, einschließlich, dass LIMIT/OFFSET nicht angewendet wurde, wenn filter() aufgerufen wird, kein Kriterium vorhanden ist, wenn get() aufgerufen wird, und keine „from_statement()“ existiert, wenn filter()/order_by()/group_by() etc. aufgerufen wird. Dieser permissivere Modus wird von benutzerdefinierten Query-Unterklassen verwendet, um Kriterien oder andere Modifikatoren außerhalb der üblichen Nutzungsmuster anzugeben.
Es sollte darauf geachtet werden, dass das Nutzungsmuster überhaupt möglich ist. Eine durch from_statement() angewendete Anweisung überschreibt beispielsweise alle durch filter() oder order_by() festgelegten Kriterien.
-
method
sqlalchemy.orm.Query.enable_eagerloads(value: bool) → Self¶ Steuert, ob Eager-Joins und Unterabfragen gerendert werden.
Wenn auf False gesetzt, rendert die zurückgegebene Query keine Eager-Joins, unabhängig von den Optionen
joinedload(),subqueryload()oder den Mapper-Level-Konfigurationenlazy='joined'/lazy='subquery'.Dies wird hauptsächlich beim Einbetten der Anweisung der Query in eine Unterabfrage oder ein anderes auswählbares Element verwendet, oder bei der Verwendung von
Query.yield_per().
-
method
sqlalchemy.orm.Query.except_(*q: Query) → Self¶ Erzeugt ein EXCEPT dieser Query gegen eine oder mehrere Queries.
Funktioniert genauso wie
Query.union(). Siehe diese Methode für Anwendungsbeispiele.Siehe auch
Select.except_()- V2-äquivalente Methode.
-
method
sqlalchemy.orm.Query.except_all(*q: Query) → Self¶ Erzeugt ein EXCEPT ALL dieser Query gegen eine oder mehrere Queries.
Funktioniert genauso wie
Query.union(). Siehe diese Methode für Anwendungsbeispiele.Siehe auch
Select.except_all()- V2-äquivalente Methode.
-
method
sqlalchemy.orm.Query.execution_options(**kwargs: Any) → Self¶ Legt nicht-SQL-Optionen fest, die während der Ausführung wirksam werden.
Hier zulässige Optionen umfassen alle, die von
Connection.execution_options()akzeptiert werden, sowie eine Reihe von ORM-spezifischen Optionenpopulate_existing=True- entspricht der Verwendung vonQuery.populate_existing()autoflush=True|False- entspricht der Verwendung vonQuery.autoflush()yield_per=<value>- entspricht der Verwendung vonQuery.yield_per()Beachten Sie, dass die Ausführungsoption
stream_resultsautomatisch aktiviert wird, wenn die Methode oder AusführungsoptionQuery.yield_per()verwendet wird.Neu in Version 1.4: - ORM-Optionen zu
Query.execution_options()hinzugefügtDie Ausführungsoptionen können auch auf einer pro Ausführungsebene festgelegt werden, wenn 2.0-Stil-Queries über den Parameter
Session.execution_optionsverwendet werden.Warnung
Der Parameter
Connection.execution_options.stream_resultssollte nicht auf der Ebene einzelner ORM-Anweisungsausführungen verwendet werden, da dieSessionkeine Objekte aus verschiedenen Schema-Translate-Maps innerhalb einer einzelnen Sitzung verfolgen wird. Für mehrere Schema-Translate-Maps innerhalb des Geltungsbereichs einer einzelnenSessionsiehe Horizontales Sharding.Siehe auch
Verwendung von serverseitigen Cursern (auch bekannt als Stream-Ergebnisse)
Select.execution_options()- V2-äquivalente Methode.
-
method
sqlalchemy.orm.Query.exists() → Exists¶ Eine Komfortmethode, die eine Abfrage in eine EXISTS-Unterabfrage vom Typ EXISTS (SELECT 1 FROM ... WHERE ...) umwandelt.
z. B.
q = session.query(User).filter(User.name == "fred") session.query(q.exists())
SQL, ähnlich wie
SELECT EXISTS ( SELECT 1 FROM users WHERE users.name = :name_1 ) AS anon_1
Der EXISTS-Konstrukt wird normalerweise in der WHERE-Klausel verwendet
session.query(User.id).filter(q.exists()).scalar()Beachten Sie, dass einige Datenbanken wie SQL Server einen EXISTS-Ausdruck nicht in der Spaltenklausel eines SELECT zulassen. Um einen einfachen booleschen Wert basierend auf EXISTS als WHERE auszuwählen, verwenden Sie
literal()from sqlalchemy import literal session.query(literal(True)).filter(q.exists()).scalar()
Siehe auch
Select.exists()- V2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.filter(*criterion: _ColumnExpressionArgument[bool]) → Self¶ Wendet das gegebene Filterkriterium auf eine Kopie dieser
Queryunter Verwendung von SQL-Ausdrücken an.z. B.
session.query(MyClass).filter(MyClass.name == "some name")Mehrere Kriterien können durch Kommas getrennt angegeben werden; der Effekt ist, dass sie mit der Funktion
and_()verbunden werden.session.query(MyClass).filter(MyClass.name == "some name", MyClass.id > 5)Das Kriterium ist jedes SQL-Ausdrucksobjekt, das für die WHERE-Klausel eines SELECT anwendbar ist. String-Ausdrücke werden über das
text()-Konstrukt in SQL-Ausdruckskonstrukte umgewandelt.Siehe auch
Query.filter_by()- Filtern nach Schlüsselwortausdrücken.Select.where()- V2-äquivalente Methode.
-
method
sqlalchemy.orm.Query.filter_by(**kwargs: Any) → Self¶ Wendet das gegebene Filterkriterium auf eine Kopie dieser
Queryunter Verwendung von Schlüsselwortausdrücken an.z. B.
session.query(MyClass).filter_by(name="some name")Mehrere Kriterien können durch Kommas getrennt angegeben werden; der Effekt ist, dass sie mit der Funktion
and_()verbunden werden.session.query(MyClass).filter_by(name="some name", id=5)Die Schlüsselwortausdrücke werden aus der primären Entität der Abfrage oder der letzten Entität, die das Ziel eines Aufrufs von
Query.join()war, extrahiert.Siehe auch
Query.filter()- Filtern nach SQL-Ausdrücken.Select.filter_by()- V2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.first() → _T | None¶ Gibt das erste Ergebnis dieser
Queryzurück oder None, wenn das Ergebnis keine Zeile enthält.first() wendet ein Limit von eins innerhalb der generierten SQL an, sodass auf der Serverseite nur eine primäre Entitätszeile generiert wird (beachten Sie, dass diese aus mehreren Ergebniszeilen bestehen kann, wenn joined-loaded Collections vorhanden sind).
Der Aufruf von
Query.first()führt zur Ausführung der zugrunde liegenden Abfrage.Siehe auch
Result.first()- V2 vergleichbare Methode.Result.scalars()- mit Version 2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.from_statement(statement: ExecutableReturnsRows) → Self¶ Führt die gegebene SELECT-Anweisung aus und gibt die Ergebnisse zurück.
Diese Methode umgeht die gesamte interne Anweisungsübersetzung, und die Anweisung wird ohne Änderung ausgeführt.
Die Anweisung ist typischerweise entweder ein
text()- oderselect()-Konstrukt und sollte die für die von dieserQuerydargestellte Entitätsklasse geeignete Menge an Spalten zurückgeben.Siehe auch
Select.from_statement()- V2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.get(ident: _PKIdentityArgument) → Any | None¶ Gibt eine Instanz basierend auf der angegebenen Primärschlüssel-ID zurück, oder
None, wenn sie nicht gefunden wurde.Veraltet seit Version 2.0: Die Methode
Query.get()gilt ab der 1.x-Serie von SQLAlchemy als Legacy und wird in 2.0 zu einem Legacy-Konstrukt. Die Methode ist jetzt verfügbar alsSession.get()(Hintergrund zu SQLAlchemy 2.0 unter: SQLAlchemy 2.0 - Hauptmigrationsleitfaden)Z. B.
my_user = session.query(User).get(5) some_object = session.query(VersionedFoo).get((5, 10)) some_object = session.query(VersionedFoo).get({"id": 5, "version_id": 10})
Query.get()ist besonders, da sie direkten Zugriff auf die Identitätskarte der besitzendenSessionbietet. Wenn die gegebene Primärschlüsselkennung in der lokalen Identitätskarte vorhanden ist, wird das Objekt direkt aus dieser Sammlung zurückgegeben und keine SQL-Anweisung ausgegeben, es sei denn, das Objekt wurde vollständig als abgelaufen markiert. Wenn nicht vorhanden, wird ein SELECT ausgeführt, um das Objekt zu finden.Query.get()führt auch eine Prüfung durch, ob das Objekt in der Identitätskarte vorhanden und als abgelaufen markiert ist – ein SELECT wird ausgegeben, um das Objekt zu aktualisieren und sicherzustellen, dass die Zeile noch vorhanden ist. Wenn nicht, wirdObjectDeletedErrorausgelöst.Query.get()wird nur verwendet, um eine einzelne zugeordnete Instanz zurückzugeben, nicht mehrere Instanzen oder einzelne Spaltenkonstrukte, und streng genommen auf einen einzelnen Primärschlüsselwert. Die ursprünglicheQuerymuss auf diese Weise konstruiert werden, d. h. gegen eine einzelne zugeordnete Entität, ohne zusätzliche Filterkriterien. Ladeoptionen überQuery.options()können jedoch angewendet werden und werden verwendet, wenn das Objekt noch nicht lokal vorhanden ist.- Parameter:
ident¶ –
Ein Skalar, Tupel oder Wörterbuch, das den Primärschlüssel darstellt. Für einen zusammengesetzten (z. B. mehrspaltigen) Primärschlüssel sollte ein Tupel oder Wörterbuch übergeben werden.
Für einen einspaltigen Primärschlüssel ist die skalare Aufrufform in der Regel die praktikabelste. Wenn der Primärschlüssel einer Zeile der Wert „5“ ist, sieht der Aufruf wie folgt aus
my_object = query.get(5)Das Tupel-Format enthält Primärschlüsselwerte, typischerweise in der Reihenfolge, in der sie den zugeordneten Spalten des
Table-Objekts entsprechen, oder, falls derMapper.primary_key-Konfigurationsparameter verwendet wurde, in der Reihenfolge, die für diesen Parameter verwendet wurde. Wenn beispielsweise der Primärschlüssel einer Zeile durch die Ganzzahlen "5, 10" dargestellt wird, würde der Aufruf wie folgt aussehenmy_object = query.get((5, 10))Die Wörterbuchform sollte als Schlüssel die zugeordneten Attributnamen enthalten, die jedem Element des Primärschlüssels entsprechen. Wenn die zugeordnete Klasse die Attribute
idundversion_idals Attribute hat, die den Primärschlüsselwert des Objekts speichern, sähe der Aufruf wie folgt ausmy_object = query.get({"id": 5, "version_id": 10})Neu in Version 1.3: Die Methode
Query.get()akzeptiert nun optional ein Wörterbuch von Attributnamen zu Werten, um einen Primärschlüsselidentifikator anzugeben.- Gibt zurück:
Die Objektinstanz oder
None.
-
Methode
sqlalchemy.orm.Query.get_children(*, omit_attrs: Tuple[str, ...] = (), **kw: Any) → Iterable[HasTraverseInternals]¶ geerbt von der
HasTraverseInternals.get_children()Methode vonHasTraverseInternalsGibt direkte Kind-Elemente
HasTraverseInternalsdiesesHasTraverseInternalszurück.Dies wird für die Besuchs-Traversal verwendet.
**kw kann Flags enthalten, die die zurückgegebene Sammlung ändern, z. B. um eine Teilmenge von Elementen zurückzugeben, um größere Traversierungen zu reduzieren, oder um Kind-Elemente aus einem anderen Kontext zurückzugeben (z. B. Schema-Ebene Sammlungen anstelle von Klausel-Ebene).
-
Methode
sqlalchemy.orm.Query.get_execution_options() → _ImmutableExecuteOptions¶ Ruft die nicht-SQL-Optionen ab, die während der Ausführung wirksam werden.
Neu in Version 1.3.
-
Attribut
sqlalchemy.orm.Query.get_label_style¶ Ruft den aktuellen Label-Stil ab.
Neu in Version 1.4.
Siehe auch
Select.get_label_style()- mit v2 vergleichbare Methode.
-
Methode
sqlalchemy.orm.Query.group_by(_Query__first: Literal[None, False, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ Wendet ein oder mehrere GROUP BY-Kriterien auf die Abfrage an und gibt die neu resultierende
Queryzurück.Alle vorhandenen GROUP BY-Einstellungen können durch Übergabe von
Noneunterdrückt werden - dies unterdrückt auch jede auf den Mappern konfigurierte GROUP BY-Anweisung.Siehe auch
Diese Abschnitte beschreiben GROUP BY in Bezug auf die 2.0-Style-Aufrufe, gelten aber auch für
Query.Aggregatfunktionen mit GROUP BY / HAVING - im SQLAlchemy Unified Tutorial
Sortieren oder Gruppieren nach einem Label - im SQLAlchemy Unified Tutorial
Select.group_by()- mit v2 vergleichbare Methode.
-
Methode
sqlalchemy.orm.Query.having(*having: _ColumnExpressionArgument[bool]) → Self¶ Wendet ein HAVING-Kriterium auf die Abfrage an und gibt die neu resultierende
Queryzurück.Query.having()wird in Verbindung mitQuery.group_by()verwendet.HAVING-Kriterien ermöglichen Filter für Aggregatfunktionen wie COUNT, SUM, AVG, MAX und MIN, z. B.
q = ( session.query(User.id) .join(User.addresses) .group_by(User.id) .having(func.count(Address.id) > 2) )
Siehe auch
Select.having()- mit v2 vergleichbare Methode.
-
Methode
sqlalchemy.orm.Query.instances(result_proxy: CursorResult[Any], context: QueryContext | None = None) → Any¶ Gibt ein ORM-Ergebnis zurück, das aus einem
CursorResultund einemQueryContextbesteht.Seit Version 2.0 veraltet: Die Methode
Query.instances()ist veraltet und wird in einer zukünftigen Version entfernt. Verwenden Sie stattdessen die Methode Select.from_statement() oder den Konstruktor aliased() in Verbindung mit Session.execute().
-
Methode
sqlalchemy.orm.Query.intersect(*q: Query) → Self¶ Erzeugt einen INTERSECT dieser Abfrage gegen eine oder mehrere Abfragen.
Funktioniert genauso wie
Query.union(). Siehe diese Methode für Anwendungsbeispiele.Siehe auch
Select.intersect()- mit v2 vergleichbare Methode.
-
Methode
sqlalchemy.orm.Query.intersect_all(*q: Query) → Self¶ Erzeugt einen INTERSECT ALL dieser Abfrage gegen eine oder mehrere Abfragen.
Funktioniert genauso wie
Query.union(). Siehe diese Methode für Anwendungsbeispiele.Siehe auch
Select.intersect_all()- mit v2 vergleichbare Methode.
-
Attribut
sqlalchemy.orm.Query.is_single_entity¶ Gibt an, ob diese
QueryTupel oder einzelne Entitäten zurückgibt.Gibt True zurück, wenn diese Abfrage für jede Instanz in ihrer Ergebnisliste eine einzelne Entität zurückgibt, und False, wenn diese Abfrage für jedes Ergebnis ein Tupel von Entitäten zurückgibt.
Neu ab Version 1.3.11.
Siehe auch
-
Methode
sqlalchemy.orm.Query.join(target: _JoinTargetArgument, onclause: _OnClauseArgument | None = None, *, isouter: bool = False, full: bool = False) → Self¶ Erstellt einen SQL JOIN gegen das Kriterium eines
Query-Objekts und wendet es generativ an, wobei die neu resultierendeQueryzurückgegeben wird.Einfache Beziehungs-Joins
Betrachten Sie eine Zuordnung zwischen zwei Klassen
UserundAddress, mit einer BeziehungUser.addresses, die eine Sammlung vonAddress-Objekten darstellt, die jedemUserzugeordnet sind. Die häufigste Verwendung vonQuery.join()besteht darin, einen JOIN entlang dieser Beziehung zu erstellen, wobei das AttributUser.addressesals Indikator dafür verwendet wird, wie dies geschehen soll.q = session.query(User).join(User.addresses)Wo oben der Aufruf von
Query.join()entlangUser.addresseszu SQL führt, die ungefähr dem Folgenden entspricht:SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
Im obigen Beispiel beziehen wir uns auf
User.addresses, wie es anQuery.join()übergeben wird, als die "ON-Klausel", d.h. es gibt an, wie der "ON"-Teil des JOIN konstruiert werden soll.Um eine Kette von Joins zu erstellen, können mehrere Aufrufe von
Query.join()verwendet werden. Das beziehungsgebundene Attribut impliziert sowohl die linke als auch die rechte Seite des Joins gleichzeitig.q = ( session.query(User) .join(User.orders) .join(Order.items) .join(Item.keywords) )
Hinweis
Wie im obigen Beispiel zu sehen ist, **ist die Reihenfolge, in der jeder Aufruf der join()-Methode erfolgt, wichtig**. Query wüsste beispielsweise nicht, wie es korrekt verbinden soll, wenn wir
User, dannItemund dannOrderin unserer Join-Kette angeben würden; in einem solchen Fall kann es, abhängig von den übergebenen Argumenten, einen Fehler ausgeben, dass es nicht weiß, wie es verbinden soll, oder es kann ungültiges SQL erzeugen, in welchem Fall die Datenbank einen Fehler ausgeben wird. In korrekter Praxis wird die MethodeQuery.join()so aufgerufen, dass sie mit dem übereinstimmt, wie wir die JOIN-Klauseln in SQL rendern möchten, und jeder Aufruf sollte eine klare Verbindung zu dem darstellen, was ihm vorausgeht.Joins zu einer Zielentität oder wählbar
Eine zweite Form von
Query.join()erlaubt jede gemappte Entität oder jeden CORE-selektierbaren Konstruktor als Ziel. Bei dieser Verwendung versuchtQuery.join(), einen JOIN entlang der natürlichen Fremdschlüsselbeziehung zwischen zwei Entitäten zu erstellen.q = session.query(User).join(Address)In der obigen Aufrufform wird
Query.join()aufgerufen, um die "ON-Klausel" automatisch für uns zu erstellen. Diese Aufrufform gibt letztendlich einen Fehler aus, wenn entweder keine Fremdschlüssel zwischen den beiden Entitäten vorhanden sind oder wenn mehrere Fremdschlüssellinks zwischen der Zielentität und der Entität oder den bereits auf der linken Seite vorhandenen Entitäten bestehen, so dass die Erstellung eines Joins mehr Informationen erfordert. Beachten Sie, dass bei Angabe eines Joins zu einem Ziel ohne ON-Klausel ORM-konfigurierte Beziehungen nicht berücksichtigt werden.Joins zu einem Ziel mit einer ON-Klausel
Die dritte Aufrufform erlaubt sowohl die Angabe der Zielentität als auch der ON-Klausel. Ein Beispiel, das einen SQL-Ausdruck als ON-Klausel enthält, ist wie folgt:
q = session.query(User).join(Address, User.id == Address.user_id)Die obige Form kann auch ein beziehungsgebundenes Attribut als ON-Klausel verwenden.
q = session.query(User).join(Address, User.addresses)Die obige Syntax kann für den Fall nützlich sein, dass wir zu einem Alias einer bestimmten Zielentität verbinden möchten. Wenn wir zweimal mit
Addressverbinden möchten, könnte dies durch die Verwendung von zwei Aliasen erreicht werden, die mit der Funktionaliased()eingerichtet wurden.a1 = aliased(Address) a2 = aliased(Address) q = ( session.query(User) .join(a1, User.addresses) .join(a2, User.addresses) .filter(a1.email_address == "ed@foo.com") .filter(a2.email_address == "ed@bar.com") )
Die beziehungsgebundene Aufrufform kann auch eine Zielentität über die Methode
PropComparator.of_type()angeben; eine Abfrage, die mit der obigen identisch ist, wäre:a1 = aliased(Address) a2 = aliased(Address) q = ( session.query(User) .join(User.addresses.of_type(a1)) .join(User.addresses.of_type(a2)) .filter(a1.email_address == "ed@foo.com") .filter(a2.email_address == "ed@bar.com") )
Erweiterung von integrierten ON-Klauseln
Als Ersatz für die Bereitstellung einer vollständigen benutzerdefinierten ON-Bedingung für eine vorhandene Beziehung kann die Funktion
PropComparator.and_()auf ein Beziehungsattribut angewendet werden, um zusätzliche Kriterien in die ON-Klausel einzufügen. Die zusätzlichen Kriterien werden mit den Standardkriterien über AND kombiniert.q = session.query(User).join( User.addresses.and_(Address.email_address != "foo@bar.com") )
Neu in Version 1.4.
Verbinden von Tabellen und Unterabfragen
Das Ziel eines Joins kann auch jede Tabelle oder jede SELECT-Anweisung sein, die mit einer Zielentität verbunden ist oder nicht. Verwenden Sie die entsprechende Methode
.subquery(), um eine Abfrage in eine Unterabfrage umzuwandeln.subq = ( session.query(Address) .filter(Address.email_address == "ed@foo.com") .subquery() ) q = session.query(User).join(subq, User.id == subq.c.user_id)
Die Verbindung zu einer Unterabfrage in Bezug auf eine bestimmte Beziehung und/oder Zielentität kann durch Verknüpfung der Unterabfrage mit der Entität mittels
aliased()erreicht werden.subq = ( session.query(Address) .filter(Address.email_address == "ed@foo.com") .subquery() ) address_subq = aliased(Address, subq) q = session.query(User).join(User.addresses.of_type(address_subq))
Steuerung, von wo verbunden werden soll
In Fällen, in denen die linke Seite des aktuellen Zustands von
Querynicht mit dem übereinstimmt, von wo aus wir verbinden möchten, kann die MethodeQuery.select_from()verwendet werden.q = ( session.query(Address) .select_from(User) .join(User.addresses) .filter(User.name == "ed") )
Was zu ähnlichem SQL führt wie
SELECT address.* FROM user JOIN address ON user.id=address.user_id WHERE user.name = :name_1
Siehe auch
Select.join()- mit v2 vergleichbare Methode.- Parameter:
*props¶ – Eingehende Argumente für
Query.join(). Die Props-Sammlung sollte im modernen Gebrauch als ein- oder zweistelliges Format betrachtet werden, entweder als einzelne "Ziel"-Entität oder ORM-attributgebundene Beziehung oder als Zielentität plus eine "ON-Klausel", die ein SQL-Ausdruck oder eine ORM-attributgebundene Beziehung sein kann.isouter=False¶ – Wenn True, ist der verwendete Join ein OUTER JOIN (LEFT OUTER JOIN), so als ob die Methode
Query.outerjoin()aufgerufen worden wäre.full=False¶ – Rendert FULL OUTER JOIN; impliziert
isouter.
-
Methode
sqlalchemy.orm.Query.label(name: str | None) → Label[Any]¶ Gibt die vollständige SELECT-Anweisung zurück, die von dieser
Queryrepräsentiert wird, konvertiert in eine skalare Unterabfrage mit einem Label des angegebenen Namens.Siehe auch
Select.label()- mit v2 vergleichbare Methode.
-
Attribut
sqlalchemy.orm.Query.lazy_loaded_from¶ Eine
InstanceState, die dieseQueryfür eine Lazy-Load-Operation verwendet.Seit Version 1.4 veraltet: Dieses Attribut sollte über das Attribut
ORMExecuteState.lazy_loaded_fromim Kontext des EreignissesSessionEvents.do_orm_execute()aufgerufen werden.Siehe auch
-
Methode
sqlalchemy.orm.Query.limit(limit: _LimitOffsetType) → Self¶ Wendet eine
LIMIT-Klausel auf die Abfrage an und gibt die neu resultierendeQueryzurück.Siehe auch
Select.limit()- mit v2 vergleichbare Methode.
-
Methode
sqlalchemy.orm.Query.merge_result(iterator: FrozenResult[Any] | Iterable[Sequence[Any]] | Iterable[object], load: bool = True) → FrozenResult[Any] | Iterable[Any]¶ Fügt ein Ergebnis in die Session dieses
Query-Objekts ein.Seit Version 2.0 veraltet: Die Methode
Query.merge_result()gilt ab der 1.x-Serie von SQLAlchemy als veraltet und wird in 2.0 zu einem veralteten Konstrukt. Die Methode wird durch die Funktionmerge_frozen_result()ersetzt. (Hintergrund zu SQLAlchemy 2.0 unter: SQLAlchemy 2.0 - Hauptmigrationsanleitung)Gibt einen identischen Iterator von Ergebnissen zurück, indem ein Iterator, der von einer
Querymit derselben Struktur wie diese zurückgegeben wird, mit allen gemappten Instanzen zusammengeführt wird, die mithilfe vonSession.merge()in die Session gemergt werden. Dies ist eine optimierte Methode, die alle gemappten Instanzen zusammenführt und die Struktur der Zeilen und nicht zugeordneten Spalten mit weniger Methoden-Overhead als das explizite Aufrufen vonSession.merge()für jeden Wert beibehält.Die Struktur der Ergebnisse wird basierend auf der Spaltenliste dieser
Querybestimmt. Wenn diese nicht übereinstimmen, treten nicht geprüfte Fehler auf.Das Argument "load" ist dasselbe wie bei
Session.merge().Ein Beispiel dafür, wie
Query.merge_result()verwendet wird, finden Sie im Quellcode des Beispiels Dogpile Caching, woQuery.merge_result()verwendet wird, um Zustände effizient aus einem Cache zurück in eine Ziel-Sessionwiederherzustellen.
-
Methode
sqlalchemy.orm.Query.offset(offset: _LimitOffsetType) → Self¶ Wendet eine
OFFSET-Klausel auf die Abfrage an und gibt die neu resultierendeQueryzurück.Siehe auch
Select.offset()- mit v2 vergleichbare Methode.
-
Methode
sqlalchemy.orm.Query.one() → _T¶ Gibt genau ein Ergebnis zurück oder löst eine Ausnahme aus.
Löst
sqlalchemy.orm.exc.NoResultFoundaus, wenn die Abfrage keine Zeilen auswählt. Löstsqlalchemy.orm.exc.MultipleResultsFoundaus, wenn mehrere Objektidentitäten zurückgegeben werden oder wenn mehrere Zeilen für eine Abfrage zurückgegeben werden, die nur skalare Werte anstelle von vollständig identitätsgemappten Entitäten zurückgibt.Der Aufruf von
one()führt zur Ausführung der zugrundeliegenden Abfrage.Siehe auch
Result.one()- mit v2 vergleichbare Methode.Result.scalar_one()- mit v2 vergleichbare Methode.
-
Methode
sqlalchemy.orm.Query.one_or_none() → _T | None¶ Gibt maximal ein Ergebnis zurück oder löst eine Ausnahme aus.
Gibt
Nonezurück, wenn die Abfrage keine Zeilen auswählt. Löstsqlalchemy.orm.exc.MultipleResultsFoundaus, wenn mehrere Objektidentitäten zurückgegeben werden oder wenn mehrere Zeilen für eine Abfrage zurückgegeben werden, die nur skalare Werte im Gegensatz zu vollständig identitätsgemappten Entitäten zurückgibt.Der Aufruf von
Query.one_or_none()führt zur Ausführung der zugrundeliegenden Abfrage.Siehe auch
Result.one_or_none()- vergleichbare Methode für v2.Result.scalar_one_or_none()- vergleichbare Methode für v2.
-
Methode
sqlalchemy.orm.Query.only_return_tuples(value: bool) → Query¶ Wenn auf True gesetzt, sind die Abfrageergebnisse immer ein
Row-Objekt.Dies kann eine Abfrage ändern, die normalerweise eine einzelne Entität als Skalar zurückgibt, so dass sie in allen Fällen ein
Row-Ergebnis zurückgibt.Siehe auch
Query.tuples()- gibt Tupel zurück, typisiert aber auf Typenebene Ergebnisse auch alsTuple.Result.tuples()- vergleichbare Methode für v2.
-
Methode
sqlalchemy.orm.Query.options(*args: ExecutableOption) → Self¶ Gibt ein neues
Query-Objekt zurück, das die angegebene Liste von Mapper-Optionen anwendet.Die meisten bereitgestellten Optionen beziehen sich auf die Änderung der Ladeweise von spalten- und beziehungsweise gemappten Attributen.
-
Methode
sqlalchemy.orm.Query.order_by(_Query__first: Literal[None, False, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ Wendet ein oder mehrere ORDER BY-Kriterien auf die Abfrage an und gibt die neu resultierende
Queryzurück.z. B.
q = session.query(Entity).order_by(Entity.id, Entity.name)Das mehrmalige Aufrufen dieser Methode ist äquivalent zum einmaligen Aufruf mit allen verketteten Klauseln. Alle vorhandenen ORDER BY-Kriterien können durch Übergabe von
Noneallein abgebrochen werden. Neue ORDER BY-Kriterien können dann durch erneuten Aufruf vonQuery.order_by()hinzugefügt werden, z.B.# will erase all ORDER BY and ORDER BY new_col alone q = q.order_by(None).order_by(new_col)
Siehe auch
Diese Abschnitte beschreiben ORDER BY in Bezug auf die 2.0-Stil-Aufrufe, gelten aber auch für
Query.ORDER BY - im SQLAlchemy Unified Tutorial
Sortieren oder Gruppieren nach einem Label - im SQLAlchemy Unified Tutorial
Select.order_by()- vergleichbare Methode für v2.
-
Methode
sqlalchemy.orm.Query.outerjoin(target: _JoinTargetArgument, onclause: _OnClauseArgument | None = None, *, full: bool = False) → Self¶ Erstellt einen linken äußeren Join gegen das Kriterium des
Query-Objekts und wendet ihn generativ an, wobei die neu resultierendeQueryzurückgegeben wird.Die Verwendung ist dieselbe wie bei der
join()-Methode.Siehe auch
Select.outerjoin()- vergleichbare Methode für v2.
-
Methode
sqlalchemy.orm.Query.params(_Query__params: Dict[str, Any] | None = None, **kw: Any) → Self¶ Fügt Werte für Bindungsparameter hinzu, die möglicherweise in filter() angegeben wurden.
Parameter können entweder über **kwargs oder optional ein einzelnes Dictionary als erstes positionelles Argument angegeben werden. Der Grund für beides ist, dass **kwargs praktisch ist, aber einige Parameter-Dictionaries Unicode-Schlüssel enthalten, in welchen Fällen **kwargs nicht verwendet werden kann.
-
Methode
sqlalchemy.orm.Query.populate_existing() → Self¶ Gibt eine
Queryzurück, die alle geladenen Instanzen verfallen lässt und neu lädt, oder aus der aktuellenSessionwiederverwendet.Seit SQLAlchemy 1.4 ist die Methode
Query.populate_existing()äquivalent zur Verwendung der Ausführungsoptionpopulate_existingauf ORM-Ebene. Weitere Hintergrundinformationen zu dieser Option finden Sie im Abschnitt Populate Existing.
-
Methode
sqlalchemy.orm.Query.prefix_with(*prefixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ geerbt von der
HasPrefixes.prefix_with()Methode vonHasPrefixesFügt ein oder mehrere Ausdrücke nach dem Anweisungs-Schlüsselwort hinzu, d.h. SELECT, INSERT, UPDATE oder DELETE. Generativ.
Dies wird verwendet, um Backend-spezifische Präfix-Schlüsselwörter zu unterstützen, wie sie von MySQL bereitgestellt werden.
Z. B.
stmt = table.insert().prefix_with("LOW_PRIORITY", dialect="mysql") # MySQL 5.7 optimizer hints stmt = select(table).prefix_with("/*+ BKA(t1) */", dialect="mysql")
Mehrere Präfixe können durch mehrfache Aufrufe von
HasPrefixes.prefix_with()angegeben werden.- Parameter:
*prefixes¶ – textueller Ausdruck oder
ClauseElement-Konstrukt, das nach dem INSERT-, UPDATE- oder DELETE-Schlüsselwort gerendert wird.dialect¶ – optionaler String mit dem Dialektnamen, der die Renderung dieses Präfixes nur für diesen Dialekt beschränkt.
-
Methode
sqlalchemy.orm.Query.reset_joinpoint() → Self¶ Gibt eine neue
Queryzurück, bei der der „Joinpunkt“ auf die Basis-FROM-Entitäten der Abfrage zurückgesetzt wurde.Diese Methode wird normalerweise in Verbindung mit dem Feature
aliased=Trueder MethodeQuery.join()verwendet. Siehe das Beispiel inQuery.join(), wie dies verwendet wird.
-
Methode
sqlalchemy.orm.Query.scalar() → Any¶ Gibt das erste Element des ersten Ergebnisses zurück oder None, wenn keine Zeilen vorhanden sind. Wenn mehrere Zeilen zurückgegeben werden, wird MultipleResultsFound ausgelöst.
>>> session.query(Item).scalar() <Item> >>> session.query(Item.id).scalar() 1 >>> session.query(Item.id).filter(Item.id < 0).scalar() None >>> session.query(Item.id, Item.name).scalar() 1 >>> session.query(func.count(Parent.id)).scalar() 20
Dies führt zur Ausführung der zugrundeliegenden Abfrage.
Siehe auch
Result.scalar()- vergleichbare Methode für v2.
-
Methode
sqlalchemy.orm.Query.scalar_subquery() → ScalarSelect[Any]¶ Gibt die vollständige SELECT-Anweisung, die von dieser
Queryrepräsentiert wird, als skalare Unterabfrage zurück.Analog zu
SelectBase.scalar_subquery().Geändert in Version 1.4: Die Methode
Query.scalar_subquery()ersetzt die MethodeQuery.as_scalar().Siehe auch
Select.scalar_subquery()- vergleichbare Methode für v2.
-
Methode
sqlalchemy.orm.Query.select_from(*from_obj: FromClauseRole | Type[Any] | Inspectable[_HasClauseElement[Any]] | _HasClauseElement[Any]) → Self¶ Legt die FROM-Klausel dieser
Queryexplizit fest.Query.select_from()wird oft in Verbindung mitQuery.join()verwendet, um zu steuern, von welcher Entität auf der „linken“ Seite des Joins ausgewählt wird.Die hier angegebene Entität oder das wählbare Objekt ersetzt effektiv den „linken Rand“ aller Aufrufe von
Query.join(), wenn kein Joinpunkt anderweitig festgelegt ist – normalerweise ist der Standard-„Joinpunkt“ die linkeste Entität in der Liste der auszuwählenenden Entitäten desQuery-Objekts.Ein typisches Beispiel
q = ( session.query(Address) .select_from(User) .join(User.addresses) .filter(User.name == "ed") )
Das SQL erzeugt, das äquivalent zu
SELECT address.* FROM user JOIN address ON user.id=address.user_id WHERE user.name = :name_1
- Parameter:
*from_obj¶ – Sammlung einer oder mehrerer Entitäten, die auf die FROM-Klausel angewendet werden sollen. Entitäten können gemappte Klassen,
AliasedClass-Objekte,Mapper-Objekte sowie Kern-FromClause-Elemente wie Subabfragen sein.
-
Attribut
sqlalchemy.orm.Query.selectable¶ Gibt das von dieser
QueryausgegebeneSelect-Objekt zurück.Verwendet für
inspect()Kompatibilität, dies ist äquivalent zuquery.enable_eagerloads(False).with_labels().statement
-
Methode
sqlalchemy.orm.Query.set_label_style(style: SelectLabelStyle) → Self¶ Wendet Spalten-Labels auf den Rückgabewert von Query.statement an.
Gibt an, dass der `statement`-Accessor dieser Query eine SELECT-Anweisung zurückgeben soll, die allen Spalten Labels im Format <tabellenname>_<spaltenname> zuweist; dies wird häufig verwendet, um Spalten aus mehreren Tabellen zu disambiguieren, die denselben Namen haben.
Wenn die `Query` tatsächlich SQL ausgibt, um Zeilen zu laden, verwendet sie immer Spalten-Labeling.
Hinweis
Die Methode
Query.set_label_style()wendet die Ausgabe vonQuery.statementan und nicht auf die Ergebniszeilen-aufrufenden Systeme vonQueryselbst, z.B.Query.first(),Query.all(), usw. Um eine Abfrage mitQuery.set_label_style()auszuführen, rufen SieQuery.statementmitSession.execute()auf.result = session.execute( query.set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL).statement )
Neu in Version 1.4.
Siehe auch
Select.set_label_style()- vergleichbare Methode für v2.
-
Methode
sqlalchemy.orm.Query.slice(start: int, stop: int) → Self¶ Berechnet den „Slice“ der durch die angegebenen Indizes repräsentierten
Queryund gibt die resultierendeQueryzurück.Die Start- und Stoppindizes verhalten sich wie die Argumente für die integrierte Funktion
range()von Python. Diese Methode bietet eine Alternative zur Verwendung vonLIMIT/OFFSET, um einen Slice der Abfrage zu erhalten.Zum Beispiel,
session.query(User).order_by(User.id).slice(1, 3)wird gerendert als
SELECT users.id AS users_id, users.name AS users_name FROM users ORDER BY users.id LIMIT ? OFFSET ? (2, 1)
-
Attribut
sqlalchemy.orm.Query.statement¶ Die vollständige SELECT-Anweisung, die von dieser Query repräsentiert wird.
Die Anweisung hat standardmäßig keine disambiguierenden Labels, die auf das Konstrukt angewendet werden, es sei denn, `with_labels(True)` wird zuerst aufgerufen.
-
Methode
sqlalchemy.orm.Query.subquery(name: str | None = None, with_labels: bool = False, reduce_columns: bool = False) → Subquery¶ Gibt die vollständige SELECT-Anweisung, die von dieser
Queryrepräsentiert wird, eingebettet in einenAliaszurück.Eager JOIN-Generierung innerhalb der Abfrage ist deaktiviert.
Siehe auch
Select.subquery()- vergleichbare Methode für v2.- Parameter:
name¶ – String-Name, der als Alias zugewiesen werden soll; dies wird an
FromClause.alias()weitergegeben. WennNone, wird zur Kompilierungszeit ein Name deterministisch generiert.with_labels¶ – wenn True, wird `with_labels()` auf der
Queryzuerst aufgerufen, um tabellenqualifizierte Labels auf alle Spalten anzuwenden.reduce_columns¶ – wenn True, wird `Select.reduce_columns()` auf dem resultierenden `select()`-Konstrukt aufgerufen, um Spalten mit demselben Namen zu entfernen, bei denen eine andere über einen Fremdschlüssel oder eine WHERE-Klausel-Äquivalenz verweist.
-
method
sqlalchemy.orm.Query.suffix_with(*suffixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ geerbt von der
HasSuffixes.suffix_with()Methode vonHasSuffixesFügt dem gesamten Statement einen oder mehrere Ausdrücke hinzu.
Dies dient zur Unterstützung backend-spezifischer Suffix-Schlüsselwörter für bestimmte Konstrukte.
Z. B.
stmt = ( select(col1, col2) .cte() .suffix_with( "cycle empno set y_cycle to 1 default 0", dialect="oracle" ) )
Mehrere Suffixe können durch mehrfache Aufrufe von
HasSuffixes.suffix_with()angegeben werden.- Parameter:
*suffixes¶ – Textuelle oder
ClauseElementKonstrukt, das nach der Zielklausel gerendert wird.dialect¶ – Optionaler Dialektname als Zeichenkette, der die Wiedergabe dieses Suffixes nur auf diesen Dialekt beschränkt.
-
method
sqlalchemy.orm.Query.tuples() → Query¶ Gibt eine Tupel-typisierte Form dieser
Queryzurück.Diese Methode ruft die Methode
Query.only_return_tuples()mit dem WertTrueauf, was selbst sicherstellt, dass dieseQueryimmerRow-Objekte zurückgibt, auch wenn die Abfrage gegen eine einzelne Entität durchgeführt wird. Anschließend gibt sie auf Typenebene auch eine "typisierte" Abfrage zurück, falls möglich, die Ergebniszeilen alsTuple-Objekte mit typisierten Elementen typisiert.Diese Methode kann mit der Methode
Result.tuples()verglichen werden, die "self" zurückgibt, aber aus Typisierungsgesichtspunkten ein Objekt zurückgibt, das typisierteTuple-Objekte für Ergebnisse liefert. Die Typisierung wirkt sich nur aus, wenn diesesQuery-Objekt bereits ein typisiertes Query-Objekt ist.Neu in Version 2.0.
Siehe auch
Result.tuples()- v2 äquivalente Methode.
-
method
sqlalchemy.orm.Query.union(*q: Query) → Self¶ Erzeugt eine UNION dieser Abfrage gegen eine oder mehrere Abfragen.
z. B.
q1 = sess.query(SomeClass).filter(SomeClass.foo == "bar") q2 = sess.query(SomeClass).filter(SomeClass.bar == "foo") q3 = q1.union(q2)
Die Methode akzeptiert mehrere Query-Objekte, um die Verschachtelungsebene zu steuern. Eine Reihe von
union()-Aufrufen wiex.union(y).union(z).all()werden bei jedem
union()verschachtelt und erzeugenSELECT * FROM (SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y) UNION SELECT * FROM Z)
Während
x.union(y, z).all()produziert
SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y UNION SELECT * FROM Z)
Beachten Sie, dass viele Datenbank-Backends ORDER BY nicht auf einer Abfrage rendern, die innerhalb von UNION, EXCEPT usw. aufgerufen wird. Um alle ORDER BY-Klauseln zu deaktivieren, einschließlich derjenigen, die auf Mappern konfiguriert sind, geben Sie
query.order_by(None)an – das resultierendeQuery-Objekt rendert ORDER BY nicht innerhalb seiner SELECT-Anweisung.Siehe auch
Select.union()- v2 äquivalente Methode.
-
method
sqlalchemy.orm.Query.union_all(*q: Query) → Self¶ Erzeugt eine UNION ALL dieser Abfrage gegen eine oder mehrere Abfragen.
Funktioniert genauso wie
Query.union(). Siehe diese Methode für Anwendungsbeispiele.Siehe auch
Select.union_all()- v2 äquivalente Methode.
-
method
sqlalchemy.orm.Query.update(values: Dict[_DMLColumnArgument, Any], synchronize_session: SynchronizeSessionArgument = 'auto', update_args: Dict[Any, Any] | None = None) → int¶ Führt ein UPDATE mit einer beliebigen WHERE-Klausel durch.
Aktualisiert Zeilen, die von dieser Abfrage in der Datenbank gefunden wurden.
Z. B.
sess.query(User).filter(User.age == 25).update( {User.age: User.age - 10}, synchronize_session=False ) sess.query(User).filter(User.age == 25).update( {"age": User.age - 10}, synchronize_session="evaluate" )
Warnung
Siehe den Abschnitt ORM-fähige INSERT-, UPDATE- und DELETE-Anweisungen für wichtige Vorbehalte und Warnungen, einschließlich Einschränkungen bei der Verwendung von beliebigen UPDATE und DELETE mit Mapper-Vererbungskonfigurationen.
- Parameter:
values¶ – ein Wörterbuch mit Attributnamen oder alternativ zugeordneten Attributen oder SQL-Ausdrücken als Schlüssel und literalen Werten oder SQL-Ausdrücken als Werten. Wenn der parameter-orientierte Modus gewünscht ist, können die Werte als Liste von 2-Tupeln übergeben werden; dies erfordert, dass das Flag
update.preserve_parameter_orderebenfalls an das WörterbuchQuery.update.update_argsübergeben wird.synchronize_session¶ – wählt die Strategie zur Aktualisierung der Attribute von Objekten in der Sitzung. Siehe den Abschnitt ORM-fähige INSERT-, UPDATE- und DELETE-Anweisungen für eine Diskussion dieser Strategien.
update_args¶ – Optionales Wörterbuch, das, wenn vorhanden, an das zugrunde liegende
update()-Konstrukt als**kwfür das Objekt übergeben wird. Kann verwendet werden, um dialektspezifische Argumente wiemysql_limitsowie andere spezielle Argumente wieupdate.preserve_parameter_orderzu übergeben.
- Gibt zurück:
die Anzahl der gefundenen Zeilen, wie sie von der „Zeilenanzahl“-Funktion der Datenbank zurückgegeben wird.
-
method
sqlalchemy.orm.Query.value(column: _ColumnExpressionArgument[Any]) → Any¶ Gibt ein skolares Ergebnis zurück, das dem angegebenen Spaltenausdruck entspricht.
Veraltet seit Version 1.4:
Query.value()ist veraltet und wird in einer zukünftigen Version entfernt. Bitte verwenden SieQuery.with_entities()in Kombination mitQuery.scalar()
-
method
sqlalchemy.orm.Query.values(*columns: _ColumnsClauseArgument[Any]) → Iterable[Any]¶ Gibt einen Iterator zurück, der Tupel-Ergebnisse liefert, die den angegebenen Spalten entsprechen
Veraltet seit Version 1.4:
Query.values()ist veraltet und wird in einer zukünftigen Version entfernt. Bitte verwenden SieQuery.with_entities()
-
method
sqlalchemy.orm.Query.where(*criterion: _ColumnExpressionArgument[bool]) → Self¶ Ein Synonym für
Query.filter().Neu in Version 1.4.
Siehe auch
Select.where()- V2-äquivalente Methode.
-
attribute
sqlalchemy.orm.Query.whereclause¶ Ein schreibgeschütztes Attribut, das das aktuelle WHERE-Kriterium für diese Abfrage zurückgibt.
Der zurückgegebene Wert ist ein SQL-Ausdruckkonstrukt oder
None, wenn kein Kriterium festgelegt wurde.Siehe auch
Select.whereclause- v2 äquivalente Eigenschaft.
-
method
sqlalchemy.orm.Query.with_entities(*entities: _ColumnsClauseArgument[Any], **_Query__kw: Any) → Query[Any]¶ Gibt eine neue
Queryzurück, die die SELECT-Liste durch die angegebenen Entitäten ersetzt.z. B.
# Users, filtered on some arbitrary criterion # and then ordered by related email address q = ( session.query(User) .join(User.address) .filter(User.name.like("%ed%")) .order_by(Address.email) ) # given *only* User.id==5, Address.email, and 'q', what # would the *next* User in the result be ? subq = ( q.with_entities(Address.email) .order_by(None) .filter(User.id == 5) .subquery() ) q = q.join((subq, subq.c.email < Address.email)).limit(1)
Siehe auch
Select.with_only_columns()- v2 vergleichbare Methode.
-
method
sqlalchemy.orm.Query.with_for_update(*, nowait: bool = False, read: bool = False, of: _ForUpdateOfArgument | None = None, skip_locked: bool = False, key_share: bool = False) → Self¶ Gibt eine neue
Querymit den angegebenen Optionen für dieFOR UPDATE-Klausel zurück.Das Verhalten dieser Methode ist identisch mit dem von
GenerativeSelect.with_for_update(). Wenn sie ohne Argumente aufgerufen wird, wird der resultierendenSELECT-Anweisung eineFOR UPDATE-Klausel angehängt. Wenn zusätzliche Argumente angegeben werden, können backend-spezifische Optionen wieFOR UPDATE NOWAIToderLOCK IN SHARE MODEwirksam werden.Z. B.
q = ( sess.query(User) .populate_existing() .with_for_update(nowait=True, of=User) )
Die obige Abfrage auf einem PostgreSQL-Backend wird gerendert wie
SELECT users.id AS users_id FROM users FOR UPDATE OF users NOWAIT
Warnung
Die Verwendung von
with_for_updateim Kontext des Eager Loadings von Beziehungen wird von SQLAlchemy nicht offiziell unterstützt oder empfohlen und funktioniert möglicherweise nicht mit bestimmten Abfragen auf verschiedenen Datenbank-Backends. Wennwith_for_updateerfolgreich mit einer Abfrage verwendet wird, diejoinedload()enthält, wird SQLAlchemy versuchen, SQL zu emittieren, das alle beteiligten Tabellen sperrt.Hinweis
Es ist im Allgemeinen eine gute Idee, die Verwendung der Methode
Query.populate_existing()in Kombination mit der MethodeQuery.with_for_update()zu verwenden. Der Zweck vonQuery.populate_existing()ist es, alle aus der SELECT-Anweisung gelesenen Daten in die zurückgegebenen ORM-Objekte zu schreiben, auch wenn diese Objekte bereits im Identitäts-Map vorhanden sind.Siehe auch
GenerativeSelect.with_for_update()- Kern-Methode mit vollständiger Argument- und Verhaltensbeschreibung.Query.populate_existing()- überschreibt Attribute von Objekten, die bereits in der Identitäts-Map geladen wurden.
-
method
sqlalchemy.orm.Query.with_hint(selectable: _FromClauseArgument, text: str, dialect_name: str = '*') → Self¶ geerbt von der
HasHints.with_hint()Methode vonHasHintsFügt diesem
Selectoder einem anderen wählbaren Objekt einen Indexierungs- oder anderen Ausführungskontext-Hinweis für das gegebene wählbare Objekt hinzu.Tipp
Die Methode
Select.with_hint()fügt Hinweise hinzu, die **für eine einzelne Tabelle spezifisch** sind, an einer **dialektspezifischen** Position. Um generische Optimierungshinweise **vor** dem SELECT-Schlüsselwort einer Anweisung hinzuzufügen, wie z. B. für MySQL oder Oracle Database, verwenden Sie die MethodeSelect.prefix_with(). Um Optimierungshinweise **am Ende** einer Anweisung hinzuzufügen, wie z. B. für PostgreSQL, verwenden Sie die MethodeSelect.with_statement_hint().Der Text des Hinweises wird an der entsprechenden Stelle für das verwendete Datenbank-Backend gerendert, relativ zu der als
selectable-Argument übergebenenTableoderAlias. Die Dialektimplementierung verwendet typischerweise die Python-String-Substitutionssyntax mit dem Token%(name)s, um den Namen der Tabelle oder des Alias zu rendern. Z. B. bei Verwendung von Oracle Database, folgendesselect(mytable).with_hint(mytable, "index(%(name)s ix_mytable)")Würde SQL rendern als
select /*+ index(mytable ix_mytable) */ ... from mytable
Die Option
dialect_namebeschränkt die Wiedergabe eines bestimmten Hinweises auf ein bestimmtes Backend. Zum Beispiel, um Hinweise für Oracle Database und MSSql gleichzeitig hinzuzufügenselect(mytable).with_hint( mytable, "index(%(name)s ix_mytable)", "oracle" ).with_hint(mytable, "WITH INDEX ix_mytable", "mssql")
Siehe auch
Select.prefix_with()- generisches SELECT-Präfixieren, das auch für einige datenbankspezifische HINT-Syntaxen wie MySQL- oder Oracle Database-Optimierungshinweise geeignet ist
-
method
sqlalchemy.orm.Query.with_labels() → Self¶ Veraltet seit Version 2.0: Die Methoden
Query.with_labels()undQuery.apply_labels()gelten seit der 1.x-Reihe von SQLAlchemy als Legacy und werden in 2.0 zu Legacy-Konstrukten. Verwenden Sie stattdessen set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL).
-
method
sqlalchemy.orm.Query.with_parent(instance: object, property: attributes.QueryableAttribute[Any] | None = None, from_entity: _ExternalEntityType[Any] | None = None) → Self¶ Fügt ein Filterkriterium hinzu, das die gegebene Instanz mit einem untergeordneten Objekt oder einer Sammlung in Beziehung setzt, wobei dessen Attributstatus sowie eine eingerichtete
relationship()-Konfiguration verwendet wird.Seit Version 2.0 veraltet: Die Methode
Query.with_parent()wird ab der SQLAlchemy-Serie 1.x als veraltet betrachtet und wird in 2.0 zu einem veralteten Konstrukt. Verwenden Sie das eigenständige Konstruktwith_parent(). (Hintergrund zu SQLAlchemy 2.0 unter: SQLAlchemy 2.0 - Major Migration Guide)Die Methode verwendet die Funktion
with_parent(), um die Klausel zu generieren, deren Ergebnis anQuery.filter()übergeben wird.Die Parameter sind die gleichen wie bei
with_parent(), mit der Ausnahme, dass die gegebene Eigenschaft None sein kann, in welchem Fall eine Suche gegen die Ziel-Mapper diesesQuery-Objekts durchgeführt wird.- Parameter:
instance¶ – Eine Instanz, die eine
relationship()aufweist.property¶ – Eine klassengebundene Attribut, das angibt, welche Beziehung von der Instanz verwendet werden soll, um die Eltern-/Kind-Beziehung abzugleichen.
from_entity¶ – Entität, die als linke Seite betrachtet werden soll. Dies ist standardmäßig die „Null“-Entität des
Queryselbst.
-
methode
sqlalchemy.orm.Query.with_session(session: Session) → Self¶ Gibt eine
Queryzurück, die die angegebeneSessionverwendet.Obwohl das
Query-Objekt normalerweise über die MethodeSession.query()instanziiert wird, ist es zulässig, dieQuerydirekt zu erstellen, ohne unbedingt eineSessionzu verwenden. Eine solcheQuery-Objekt oder eine bereits mit einer anderenSessionverknüpfteQuerykann über diese Methode ein neuesQuery-Objekt erstellen, das mit einer Ziel-Session verknüpft ist.from sqlalchemy.orm import Query query = Query([MyClass]).filter(MyClass.id == 5) result = query.with_session(my_session).one()
-
methode
sqlalchemy.orm.Query.with_statement_hint(text: str, dialect_name: str = '*') → Self¶ geerbt von der
HasHints.with_statement_hint()Methode vonHasHintsFügt diesem
Selectoder einem anderen wählbaren Objekt einen Anweisungshinweis hinzu.Tipp
Select.with_statement_hint()fügt normalerweise Hinweise **am Ende** einer SELECT-Anweisung hinzu. Um dialektspezifische Hinweise wie Optimierungshinweise **vor** dem SELECT-Schlüsselwort einer SELECT-Anweisung zu platzieren, verwenden Sie die MethodeSelect.prefix_with()für einen offenen Platz oder für tabellenspezifische Hinweise kannSelect.with_hint()verwendet werden, die Hinweise an einer dialektspezifischen Stelle platziert.Diese Methode ähnelt
Select.with_hint(), außer dass sie keine einzelne Tabelle erfordert und stattdessen für die gesamte Anweisung gilt.Hinweise hier sind spezifisch für die Backend-Datenbank und können Direktiven wie Isolationslevel, Datei-Direktiven, Abruf-Direktiven usw. enthalten.
Siehe auch
Select.prefix_with()- generisches SELECT-Präfixieren, das auch für einige datenbankspezifische HINT-Syntaxen wie MySQL- oder Oracle Database-Optimierungshinweise geeignet ist
-
methode
sqlalchemy.orm.Query.with_transformation(fn: Callable[[Query], Query]) → Query¶ Gibt ein neues
Query-Objekt zurück, das durch die gegebene Funktion transformiert wurde.Z. B.
def filter_something(criterion): def transform(q): return q.filter(criterion) return transform q = q.with_transformation(filter_something(x == 5))
Dies ermöglicht die Erstellung von Ad-hoc-Rezepten für
Query-Objekte.
-
methode
sqlalchemy.orm.Query.yield_per(count: int) → Self¶ Gibt nur
countZeilen gleichzeitig zurück.Der Zweck dieser Methode ist es, bei der Abfrage sehr großer Ergebnismengen (> 10.000 Zeilen) Ergebnisse in Unterkollektionen zu stapeln und sie teilweise zurückzugeben, sodass der Python-Interpreter keine sehr großen Speicherbereiche deklarieren muss, was sowohl zeitaufwendig ist als auch zu übermäßigem Speicherverbrauch führt. Die Leistung beim Abrufen von Hunderttausenden von Zeilen kann sich oft verdoppeln, wenn eine geeignete yield-per-Einstellung (z. B. ungefähr 1000) verwendet wird, selbst mit DBAPIs, die Zeilen puffern (was die meisten tun).
Ab SQLAlchemy 1.4 ist die Methode
Query.yield_per()gleichbedeutend mit der Verwendung der Ausführungsoptionyield_perauf ORM-Ebene. Siehe den Abschnitt Abrufen großer Ergebnismengen mit Yield Per für weitere Hintergrundinformationen zu dieser Option.Siehe auch
-
method
ORM-spezifische Query-Konstrukte¶
Dieser Abschnitt wurde nach Zusätzliche ORM API-Konstrukte verschoben.
Die Designs von flambé! dem Drachen und Der Alchemist wurden von Rotem Yaari erstellt und großzügig gespendet.
Erstellt mit Sphinx 7.2.6. Dokumentation zuletzt generiert: Di 11 Mär 2025 14:40:17 EDT