SQLAlchemy 2.0 Dokumentation
SQLAlchemy ORM
- ORM Schnellstart
- ORM Abgebildete Klassenkonfiguration
- Beziehungskonfiguration
- Grundlegende Beziehungsmuster
- Adjazenzlisten-Beziehungen
- Konfiguration, wie Beziehungen verknüpft werden
- Arbeiten mit großen Sammlungen
- Sammlung-Anpassung und API-Details¶
- Anpassung des Sammlungszugriffs
- Benutzerdefinierte Sammlungsimplementierungen
- Sammlungs-API
- Sammlungsinterne
- Spezielle Beziehungspersistenzmuster
- Verwendung des Legacy-Parameters ‘backref’ für Beziehungen
- Beziehungs-API
- ORM Abfragehandbuch
- Verwendung der Sitzung
- Ereignisse und Interna
- ORM Erweiterungen
- ORM Beispiele
Projektversionen
- Vorhergehend: Arbeiten mit großen Sammlungen
- Nächstes: Spezielle Muster für Beziehungs-Persistenz
- Nach oben: Startseite
- Auf dieser Seite
- Sammlungsanpassung und API-Details
- Anpassung des Sammlungszugriffs
- Benutzerdefinierte Sammlungsimplementierungen
- Sammlungs-API
- Sammlungsinterne
Sammlung-Anpassung und API-Details¶
Die Funktion relationship() definiert eine Verknüpfung zwischen zwei Klassen. Wenn die Verknüpfung eine Eins-zu-viele- oder Viele-zu-viele-Beziehung definiert, wird sie als Python-Sammlung dargestellt, wenn Objekte geladen und manipuliert werden. Dieser Abschnitt enthält zusätzliche Informationen zur Sammlungskonfiguration und -techniken.
Anpassung des Sammlungszugriffs¶
Die Abbildung einer Eins-zu-viele- oder Viele-zu-viele-Beziehung führt zu einer Sammlung von Werten, die über ein Attribut der Elterninstanz zugänglich sind. Die zwei gängigsten Sammlungsarten hierfür sind list und set, die in Deklarativen Abbildungen, die Mapped verwenden, durch die Verwendung des Sammlungs-Typs innerhalb des Mapped-Containers festgelegt wird, wie unten im Parent.children-Sammlung gezeigt wird, wo list verwendet wird.
from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
class Base(DeclarativeBase):
pass
class Parent(Base):
__tablename__ = "parent"
parent_id: Mapped[int] = mapped_column(primary_key=True)
# use a list
children: Mapped[List["Child"]] = relationship()
class Child(Base):
__tablename__ = "child"
child_id: Mapped[int] = mapped_column(primary_key=True)
parent_id: Mapped[int] = mapped_column(ForeignKey("parent.id"))Oder für ein set, veranschaulicht in der gleichen Parent.children-Sammlung.
from typing import Set
from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
class Base(DeclarativeBase):
pass
class Parent(Base):
__tablename__ = "parent"
parent_id: Mapped[int] = mapped_column(primary_key=True)
# use a set
children: Mapped[Set["Child"]] = relationship()
class Child(Base):
__tablename__ = "child"
child_id: Mapped[int] = mapped_column(primary_key=True)
parent_id: Mapped[int] = mapped_column(ForeignKey("parent.id"))Hinweis
Wenn Sie Python 3.7 oder 3.8 verwenden, müssen Anmerkungen für Sammlungen typing.List oder typing.Set verwenden, z. B. Mapped[List["Child"]] oder Mapped[Set["Child"]]; die Python-Built-ins list und set unterstützen in diesen Python-Versionen noch keine generische Anmerkung, wie z. B.
from typing import List
class Parent(Base):
__tablename__ = "parent"
parent_id: Mapped[int] = mapped_column(primary_key=True)
# use a List, Python 3.8 and earlier
children: Mapped[List["Child"]] = relationship()Wenn Sie Abbildungen ohne die Mapped-Anmerkung verwenden, z. B. bei der Verwendung von imperativen Abbildungen oder untypisiertem Python-Code, sowie in einigen Sonderfällen, kann die Sammlungs-Klasse für eine relationship() immer direkt über den Parameter relationship.collection_class angegeben werden.
# non-annotated mapping
class Parent(Base):
__tablename__ = "parent"
parent_id = mapped_column(Integer, primary_key=True)
children = relationship("Child", collection_class=set)
class Child(Base):
__tablename__ = "child"
child_id = mapped_column(Integer, primary_key=True)
parent_id = mapped_column(ForeignKey("parent.id"))Wenn relationship.collection_class oder Mapped nicht vorhanden sind, ist der Standard-Sammlungstyp list.
Über die list und set Built-ins hinaus gibt es auch Unterstützung für zwei Varianten von Wörterbüchern, die unten unter Wörterbuch-Sammlungen beschrieben sind. Es gibt auch Unterstützung für jeden beliebigen veränderlichen Sequenztyp, der als Ziel-Sammlung eingerichtet werden kann, mit einigen zusätzlichen Konfigurationsschritten; dies ist im Abschnitt Benutzerdefinierte Sammlungsimplementierungen beschrieben.
Wörterbuch-Sammlungen¶
Beim Verwenden eines Wörterbuchs als Sammlung sind einige zusätzliche Details erforderlich. Dies liegt daran, dass Objekte immer als Listen aus der Datenbank geladen werden und eine Strategie zur Schlüsselgenerierung verfügbar sein muss, um das Wörterbuch korrekt zu befüllen. Die Funktion attribute_keyed_dict() ist bei weitem die gebräuchlichste Methode, um eine einfache Wörterbuch-Sammlung zu erreichen. Sie erzeugt eine Wörterbuch-Klasse, die ein bestimmtes Attribut der abgebildeten Klasse als Schlüssel anwendet. Unten bilden wir eine Item-Klasse ab, die ein Wörterbuch von Note-Objekten enthält, die auf das Attribut Note.keyword abgebildet sind. Bei der Verwendung von attribute_keyed_dict() kann die Mapped-Anmerkung mit KeyFuncDict oder einfach nur mit dict typisiert werden, wie im folgenden Beispiel gezeigt. In diesem Fall ist jedoch der Parameter relationship.collection_class erforderlich, damit attribute_keyed_dict() entsprechend parametrisiert werden kann.
from typing import Dict
from typing import Optional
from sqlalchemy import ForeignKey
from sqlalchemy.orm import attribute_keyed_dict
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
class Base(DeclarativeBase):
pass
class Item(Base):
__tablename__ = "item"
id: Mapped[int] = mapped_column(primary_key=True)
notes: Mapped[Dict[str, "Note"]] = relationship(
collection_class=attribute_keyed_dict("keyword"),
cascade="all, delete-orphan",
)
class Note(Base):
__tablename__ = "note"
id: Mapped[int] = mapped_column(primary_key=True)
item_id: Mapped[int] = mapped_column(ForeignKey("item.id"))
keyword: Mapped[str]
text: Mapped[Optional[str]]
def __init__(self, keyword: str, text: str):
self.keyword = keyword
self.text = textItem.notes ist dann ein Wörterbuch.
>>> item = Item()
>>> item.notes["a"] = Note("a", "atext")
>>> item.notes.items()
{'a': <__main__.Note object at 0x2eaaf0>}attribute_keyed_dict() stellt sicher, dass das Attribut .keyword jeder Note mit dem Schlüssel im Wörterbuch übereinstimmt. Zum Beispiel muss bei der Zuweisung an Item.notes der bereitgestellte Wörterbuchschlüssel mit dem tatsächlichen Objekt Note übereinstimmen.
item = Item()
item.notes = {
"a": Note("a", "atext"),
"b": Note("b", "btext"),
}Das Attribut, das attribute_keyed_dict() als Schlüssel verwendet, muss überhaupt nicht abgebildet sein! Die Verwendung eines regulären Python @property ermöglicht es, praktisch jedes Detail oder jede Kombination von Details über das Objekt als Schlüssel zu verwenden, wie unten gezeigt, wenn wir es als Tupel aus Note.keyword und den ersten zehn Buchstaben des Note.text-Feldes einrichten.
class Item(Base):
__tablename__ = "item"
id: Mapped[int] = mapped_column(primary_key=True)
notes: Mapped[Dict[str, "Note"]] = relationship(
collection_class=attribute_keyed_dict("note_key"),
back_populates="item",
cascade="all, delete-orphan",
)
class Note(Base):
__tablename__ = "note"
id: Mapped[int] = mapped_column(primary_key=True)
item_id: Mapped[int] = mapped_column(ForeignKey("item.id"))
keyword: Mapped[str]
text: Mapped[str]
item: Mapped["Item"] = relationship()
@property
def note_key(self):
return (self.keyword, self.text[0:10])
def __init__(self, keyword: str, text: str):
self.keyword = keyword
self.text = textOben haben wir eine Note.item-Beziehung mit einer bidirektionalen relationship.back_populates-Konfiguration hinzugefügt. Bei der Zuweisung an diese umgekehrte Beziehung wird die Note zur Item.notes-Sammlung hinzugefügt und der Schlüssel automatisch für uns generiert.
>>> item = Item()
>>> n1 = Note("a", "atext")
>>> n1.item = item
>>> item.notes
{('a', 'atext'): <__main__.Note object at 0x2eaaf0>}Andere integrierte Wörterbuchtypen umfassen column_keyed_dict(), das fast wie attribute_keyed_dict() ist, außer dass es das Column-Objekt direkt erhält.
from sqlalchemy.orm import column_keyed_dict
class Item(Base):
__tablename__ = "item"
id: Mapped[int] = mapped_column(primary_key=True)
notes: Mapped[Dict[str, "Note"]] = relationship(
collection_class=column_keyed_dict(Note.__table__.c.keyword),
cascade="all, delete-orphan",
)sowie mapped_collection(), dem eine beliebige aufrufbare Funktion übergeben wird. Beachten Sie, dass es normalerweise einfacher ist, attribute_keyed_dict() zusammen mit einem @property zu verwenden, wie bereits erwähnt.
from sqlalchemy.orm import mapped_collection
class Item(Base):
__tablename__ = "item"
id: Mapped[int] = mapped_column(primary_key=True)
notes: Mapped[Dict[str, "Note"]] = relationship(
collection_class=mapped_collection(lambda note: note.text[0:10]),
cascade="all, delete-orphan",
)Wörterbuch-Abbildungen werden oft mit der "Association Proxy"-Erweiterung kombiniert, um gestraffte Wörterbuch-Ansichten zu erzeugen. Siehe Proxying zu Wörterbuch-basierten Sammlungen und Composite Association Proxies für Beispiele.
Umgang mit Schlüsselmutationen und Rückverfolgung für Wörterbuch-Sammlungen¶
Bei der Verwendung von attribute_keyed_dict() wird der "Schlüssel" für das Wörterbuch aus einem Attribut des Zielobjekts entnommen. Änderungen an diesem Schlüssel werden nicht verfolgt. Das bedeutet, dass der Schlüssel zugewiesen werden muss, wenn er zum ersten Mal verwendet wird, und wenn sich der Schlüssel ändert, wird die Sammlung nicht verändert. Ein typisches Beispiel, bei dem dies ein Problem darstellen könnte, ist die Abhängigkeit von Backrefs zur Befüllung einer abgebildeten Sammlungsattributs. Gegeben die folgenden
class A(Base):
__tablename__ = "a"
id: Mapped[int] = mapped_column(primary_key=True)
bs: Mapped[Dict[str, "B"]] = relationship(
collection_class=attribute_keyed_dict("data"),
back_populates="a",
)
class B(Base):
__tablename__ = "b"
id: Mapped[int] = mapped_column(primary_key=True)
a_id: Mapped[int] = mapped_column(ForeignKey("a.id"))
data: Mapped[str]
a: Mapped["A"] = relationship(back_populates="bs")Wenn wir oben ein B() erstellen, das sich auf ein bestimmtes A() bezieht, fügen die Back-Populate das B() zur A.bs-Sammlung hinzu. Wenn jedoch der Wert von B.data noch nicht gesetzt ist, ist der Schlüssel None.
>>> a1 = A()
>>> b1 = B(a=a1)
>>> a1.bs
{None: <test3.B object at 0x7f7b1023ef70>}Das nachträgliche Setzen von b1.data aktualisiert die Sammlung nicht.
>>> b1.data = "the key"
>>> a1.bs
{None: <test3.B object at 0x7f7b1023ef70>}Dies kann auch beobachtet werden, wenn man versucht, B() im Konstruktor einzurichten. Die Reihenfolge der Argumente ändert das Ergebnis.
>>> B(a=a1, data="the key")
<test3.B object at 0x7f7b10114280>
>>> a1.bs
{None: <test3.B object at 0x7f7b10114280>}vs
>>> B(data="the key", a=a1)
<test3.B object at 0x7f7b10114340>
>>> a1.bs
{'the key': <test3.B object at 0x7f7b10114340>}Wenn Backrefs auf diese Weise verwendet werden, stellen Sie sicher, dass die Attribute in der richtigen Reihenfolge über eine __init__-Methode befüllt werden.
Ein Ereignishandler wie der folgende kann ebenfalls verwendet werden, um Änderungen in der Sammlung zu verfolgen.
from sqlalchemy import event
from sqlalchemy.orm import attributes
@event.listens_for(B.data, "set")
def set_item(obj, value, previous, initiator):
if obj.a is not None:
previous = None if previous == attributes.NO_VALUE else previous
obj.a.bs[value] = obj
obj.a.bs.pop(previous)Benutzerdefinierte Sammlungsimplementierungen¶
Sie können auch eigene Typen für Sammlungen verwenden. In einfachen Fällen genügt es, von list oder set zu erben und benutzerdefiniertes Verhalten hinzuzufügen. In anderen Fällen sind spezielle Dekoratoren erforderlich, um SQLAlchemy weitere Details darüber mitzuteilen, wie die Sammlung funktioniert.
Sammlungen in SQLAlchemy werden transparent instrumentiert. Instrumentierung bedeutet, dass normale Operationen auf der Sammlung verfolgt werden und Änderungen zur Flush-Zeit in die Datenbank geschrieben werden. Zusätzlich können Sammlungsoperationen Ereignisse auslösen, die anzeigen, dass eine sekundäre Operation stattfinden muss. Beispiele für eine sekundäre Operation sind das Speichern des Kindobjekts in der Session des Elternobjekts (d. h. die save-update-Kaskade) sowie die Synchronisation des Zustands einer bidirektionalen Beziehung (d. h. ein backref()).
Das Sammlungs-Paket versteht die grundlegende Schnittstelle von Listen, Mengen und Wörterbüchern und wendet automatisch eine Instrumentierung auf diese integrierten Typen und ihre Unterklassen an. Objektbasierte Typen, die eine grundlegende Sammlungs-Schnittstelle implementieren, werden durch Duck-Typing erkannt und instrumentiert.
class ListLike:
def __init__(self):
self.data = []
def append(self, item):
self.data.append(item)
def remove(self, item):
self.data.remove(item)
def extend(self, items):
self.data.extend(items)
def __iter__(self):
return iter(self.data)
def foo(self):
return "foo"append, remove und extend sind bekannte Elemente von list und werden automatisch instrumentiert. __iter__ ist keine Mutationsmethode und wird nicht instrumentiert, und foo wird es ebenfalls nicht.
Duck-Typing (d. h. Raten) ist natürlich nicht narrensicher, daher können Sie die von Ihnen implementierte Schnittstelle explizit angeben, indem Sie ein Klassenattribut __emulates__ bereitstellen.
class SetLike:
__emulates__ = set
def __init__(self):
self.data = set()
def append(self, item):
self.data.add(item)
def remove(self, item):
self.data.remove(item)
def __iter__(self):
return iter(self.data)Diese Klasse ähnelt einer Python-list (d. h. "listenähnlich"), da sie eine append-Methode hat, aber das Attribut __emulates__ zwingt sie, als set behandelt zu werden. remove ist bekannt, Teil der Set-Schnittstelle zu sein, und wird instrumentiert.
Aber diese Klasse funktioniert noch nicht ganz: Es wird etwas Kleber benötigt, um sie für die Verwendung durch SQLAlchemy anzupassen. Die ORM muss wissen, welche Methoden zum Hinzufügen, Entfernen und Iterieren über Elemente der Sammlung verwendet werden sollen. Bei Verwendung eines Typs wie list oder set sind die entsprechenden Methoden gut bekannt und werden automatisch verwendet, sofern vorhanden. Die obige Klasse, die nur grob einer set ähnelt, stellt jedoch nicht die erwartete add-Methode bereit, daher müssen wir der ORM die Methode angeben, die stattdessen die add-Methode ersetzt. In diesem Fall wird ein Dekorator @collection.appender verwendet; dies wird im nächsten Abschnitt veranschaulicht.
Anmerkung benutzerdefinierter Sammlungen über Dekoratoren¶
Dekoratoren können verwendet werden, um die einzelnen Methoden zu kennzeichnen, die die ORM zur Verwaltung von Sammlungen benötigt. Verwenden Sie sie, wenn Ihre Klasse nicht ganz der regulären Schnittstelle ihres Container-Typs entspricht oder wenn Sie anderweitig eine andere Methode verwenden möchten, um die Aufgabe zu erledigen.
from sqlalchemy.orm.collections import collection
class SetLike:
__emulates__ = set
def __init__(self):
self.data = set()
@collection.appender
def append(self, item):
self.data.add(item)
def remove(self, item):
self.data.remove(item)
def __iter__(self):
return iter(self.data)Und das ist alles, was benötigt wird, um das Beispiel zu vervollständigen. SQLAlchemy fügt Instanzen über die append-Methode hinzu. remove und __iter__ sind die Standardmethoden für Sets und werden zum Entfernen und Iterieren verwendet. Standardmethoden können ebenfalls geändert werden.
from sqlalchemy.orm.collections import collection
class MyList(list):
@collection.remover
def zark(self, item):
# do something special...
...
@collection.iterator
def hey_use_this_instead_for_iteration(self): ...Es gibt keine Verpflichtung, "listenähnlich" oder "set-ähnlich" zu sein. Sammlungs-Klassen können jede beliebige Form haben, solange sie die für die Verwendung durch SQLAlchemy gekennzeichneten Append-, Remove- und Iterationsschnittstellen haben. Append- und Remove-Methoden werden mit einer abgebildeten Entität als einzigem Argument aufgerufen, und Iterator-Methoden werden ohne Argumente aufgerufen und müssen einen Iterator zurückgeben.
Benutzerdefinierte Wörterbuch-basierte Sammlungen¶
Die Klasse KeyFuncDict kann als Basisklasse für Ihre benutzerdefinierten Typen oder als Mix-in verwendet werden, um anderen Klassen schnell Unterstützung für dict-Sammlungen hinzuzufügen. Sie verwendet eine Schlüssel-Funktion, um an __setitem__ und __delitem__ zu delegieren.
from sqlalchemy.orm.collections import KeyFuncDict
class MyNodeMap(KeyFuncDict):
"""Holds 'Node' objects, keyed by the 'name' attribute."""
def __init__(self, *args, **kw):
super().__init__(keyfunc=lambda node: node.name)
dict.__init__(self, *args, **kw)Beim Ableiten von KeyFuncDict sollten benutzerdefinierte Versionen von __setitem__() oder __delitem__() mit collection.internally_instrumented() dekoriert werden, wenn sie diese gleichen Methoden auf KeyFuncDict aufrufen. Dies liegt daran, dass die Methoden auf KeyFuncDict bereits instrumentiert sind – der Aufruf von ihnen aus einem bereits instrumentierten Aufruf heraus kann dazu führen, dass Ereignisse wiederholt oder unangemessen ausgelöst werden, was in seltenen Fällen zu einer Beschädigung des internen Zustands führt.
from sqlalchemy.orm.collections import KeyFuncDict, collection
class MyKeyFuncDict(KeyFuncDict):
"""Use @internally_instrumented when your methods
call down to already-instrumented methods.
"""
@collection.internally_instrumented
def __setitem__(self, key, value, _sa_initiator=None):
# do something with key, value
super(MyKeyFuncDict, self).__setitem__(key, value, _sa_initiator)
@collection.internally_instrumented
def __delitem__(self, key, _sa_initiator=None):
# do something with key
super(MyKeyFuncDict, self).__delitem__(key, _sa_initiator)Die ORM versteht die dict-Schnittstelle genauso wie Listen und Sets und instrumentiert automatisch alle "wörterbuchähnlichen" Methoden, wenn Sie dict ableiten oder wörterbuchähnliche Sammlungsfunktionalität in einer Duck-Typing-Klasse bereitstellen. Sie müssen jedoch Appender- und Remover-Methoden dekorieren – es gibt keine kompatiblen Methoden in der grundlegenden Wörterbuchschnittstelle, die SQLAlchemy standardmäßig verwenden kann. Die Iteration erfolgt über values(), sofern nicht anders dekoriert.
Instrumentierung und benutzerdefinierte Typen¶
Viele benutzerdefinierte Typen und bestehende Bibliotheksklassen können ohne weitere Anpassungen als Entitätssammlungs-Typen verwendet werden. Es ist jedoch wichtig zu beachten, dass der Instrumentierungsprozess den Typ modifiziert und automatisch Dekoratoren um Methoden hinzufügt.
Die Dekorationen sind leichtgewichtig und außerhalb von Beziehungen eine No-op, aber sie verursachen unnötigen Overhead, wenn sie anderswo ausgelöst werden. Bei der Verwendung einer Bibliotheksklasse als Sammlung kann es eine gute Praxis sein, den "trivialen Unterklassen"-Trick zu verwenden, um die Dekorationen nur auf Ihre Verwendung in Beziehungen zu beschränken. Zum Beispiel:
class MyAwesomeList(some.great.library.AwesomeList):
pass
# ... relationship(..., collection_class=MyAwesomeList)Die ORM verwendet diesen Ansatz für Built-ins und ersetzt leise eine triviale Unterklasse, wenn eine list, set oder dict direkt verwendet wird.
Sammlungs-API¶
| Objektname | Beschreibung |
|---|---|
attribute_keyed_dict(attr_name, *, [ignore_unpopulated_attribute]) |
Ein Wörterbuch-basierter Sammlungs-Typ mit Attribut-basierter Schlüsselzuweisung. |
Ein Wörterbuch-basierter Sammlungs-Typ mit Attribut-basierter Schlüsselzuweisung. |
|
column_keyed_dict(mapping_spec, *, [ignore_unpopulated_attribute]) |
Ein Wörterbuch-basierter Sammlungs-Typ mit Spalten-basierter Schlüsselzuweisung. |
Ein Wörterbuch-basierter Sammlungs-Typ mit Spalten-basierter Schlüsselzuweisung. |
|
keyfunc_mapping(keyfunc, *, [ignore_unpopulated_attribute]) |
Ein Wörterbuch-basierter Sammlungs-Typ mit willkürlicher Schlüsselzuweisung. |
Basis für ORM-abgebildete Wörterbuch-Klassen. |
|
Ein Wörterbuch-basierter Sammlungs-Typ mit willkürlicher Schlüsselzuweisung. |
|
Basis für ORM-abgebildete Wörterbuch-Klassen. |
- function sqlalchemy.orm.attribute_keyed_dict(attr_name: str, *, ignore_unpopulated_attribute: bool = False) → Type[KeyFuncDict[Any, Any]]¶
Ein Wörterbuch-basierter Sammlungs-Typ mit Attribut-basierter Schlüsselzuweisung.
Geändert in Version 2.0:
attribute_mapped_collectionumbenannt inattribute_keyed_dict().Gibt eine
KeyFuncDictFabrik zurück, die neue Wörterbuchschlüssel basierend auf dem Wert eines bestimmten benannten Attributs von ORM-abgebildeten Instanzen erzeugt, die dem Wörterbuch hinzugefügt werden sollen.Hinweis
Der Wert des Zielattributs muss zum Zeitpunkt der Hinzufügung des Objekts zur Wörterbuch-Sammlung mit seinem Wert zugewiesen werden. Darüber hinaus werden Änderungen am Schlüsselattribut nicht verfolgt, was bedeutet, dass der Schlüssel im Wörterbuch nicht automatisch mit dem Schlüsselwert des Zielobjekts selbst synchronisiert wird. Weitere Details finden Sie unter Umgang mit Schlüsselmutationen und Rückverfolgung für Wörterbuch-Sammlungen.
Siehe auch
Wörterbuch-Sammlungen - Hintergrund zur Verwendung
- Parameter:
attr_name¶ – Zeichenkettenname eines ORM-abgebildeten Attributs auf der abgebildeten Klasse, dessen Wert auf einer bestimmten Instanz als Schlüssel für einen neuen Wörterbucheintrag für diese Instanz verwendet werden soll.
ignore_unpopulated_attribute¶ –
Wenn True und das Zielattribut eines Objekts überhaupt nicht befüllt ist, wird die Operation stillschweigend übersprungen. Standardmäßig wird ein Fehler ausgelöst.
Neu in Version 2.0: Standardmäßig wird ein Fehler ausgelöst, wenn das für den Wörterbuchschlüssel verwendete Attribut ermittelt wird und keinen Wert erhalten hat. Der Parameter
attribute_keyed_dict.ignore_unpopulated_attributekann gesetzt werden, was stattdessen angibt, dass dieser Zustand ignoriert werden soll und die Append-Operation stillschweigend übersprungen wird. Dies steht im Gegensatz zum Verhalten der 1.x-Serie, die den Wert fälschlicherweise im Wörterbuch mit einem willkürlichen Schlüsselwert vonNonebefüllt hätte.
- function sqlalchemy.orm.column_keyed_dict(mapping_spec: Type[_KT] | Callable[[_KT], _VT], *, ignore_unpopulated_attribute: bool = False) → Type[KeyFuncDict[_KT, _KT]]¶
Ein Wörterbuch-basierter Sammlungs-Typ mit Spalten-basierter Schlüsselzuweisung.
Geändert in Version 2.0:
column_mapped_collectionumbenannt incolumn_keyed_dict.Gibt eine
KeyFuncDictFabrik zurück, die neue Wörterbuchschlüssel basierend auf dem Wert eines bestimmtenColumn-abgebildeten Attributs von ORM-abgebildeten Instanzen erzeugt, die dem Wörterbuch hinzugefügt werden sollen.Hinweis
Der Wert des Zielattributs muss zum Zeitpunkt der Hinzufügung des Objekts zur Wörterbuch-Sammlung mit seinem Wert zugewiesen werden. Darüber hinaus werden Änderungen am Schlüsselattribut nicht verfolgt, was bedeutet, dass der Schlüssel im Wörterbuch nicht automatisch mit dem Schlüsselwert des Zielobjekts selbst synchronisiert wird. Weitere Details finden Sie unter Umgang mit Schlüsselmutationen und Rückverfolgung für Wörterbuch-Sammlungen.
Siehe auch
Wörterbuch-Sammlungen - Hintergrund zur Verwendung
- Parameter:
mapping_spec¶ – ein
Column-Objekt, das von der Ziel-Mapper-Klasse für ein bestimmtes Attribut der abgebildeten Klasse abgebildet werden soll, dessen Wert auf einer bestimmten Instanz als Schlüssel für einen neuen Wörterbucheintrag für diese Instanz verwendet wird.ignore_unpopulated_attribute¶ –
Wenn True und das durch das angegebene
Column-Zielattribut auf einem Objekt angegebene abgebildete Attribut nicht befüllt ist, wird die Operation stillschweigend übersprungen. Standardmäßig wird ein Fehler ausgelöst.Neu in Version 2.0: Standardmäßig wird ein Fehler ausgelöst, wenn festgestellt wird, dass das als Schlüssel für das Dictionary verwendete Attribut nie mit einem Wert gefüllt wurde. Der Parameter
column_keyed_dict.ignore_unpopulated_attributekann gesetzt werden, um stattdessen anzugeben, dass diese Bedingung ignoriert werden soll und der Append-Vorgang stillschweigend übersprungen wird. Dies steht im Gegensatz zum Verhalten der 1.x-Serie, die den Wert im Dictionary fälschlicherweise mit einem beliebigen Schlüsselwert vonNonegefüllt hätte.
- funktion sqlalchemy.orm.keyfunc_mapping(keyfunc: Callable[[Any], Any], *, ignore_unpopulated_attribute: bool = False) → Type[KeyFuncDict[_KT, Any]]¶
Ein Wörterbuch-basierter Sammlungs-Typ mit willkürlicher Schlüsselzuweisung.
Geändert in Version 2.0:
mapped_collectionumbenannt inkeyfunc_mapping().Gibt eine
KeyFuncDictFabrik mit einer Schlüsselbildungsfunktion zurück, die aus keyfunc generiert wird, einem aufrufbaren Objekt, das eine Entität entgegennimmt und einen Schlüsselwert zurückgibt.Hinweis
Die gegebene keyfunc wird nur einmal aufgerufen, wenn das Zielobjekt zur Sammlung hinzugefügt wird. Änderungen am effektiven Wert, der von der Funktion zurückgegeben wird, werden nicht verfolgt.
Siehe auch
Wörterbuch-Sammlungen - Hintergrund zur Verwendung
- Parameter:
keyfunc¶ – ein aufrufbares Objekt, dem die ORM-gemappte Instanz übergeben wird, die dann einen neuen Schlüssel für die Verwendung im Dictionary generieren soll. Wenn der zurückgegebene Wert
LoaderCallableStatus.NO_VALUEist, wird ein Fehler ausgelöst.ignore_unpopulated_attribute¶ –
Wenn True und das aufrufbare Objekt für eine bestimmte Instanz
LoaderCallableStatus.NO_VALUEzurückgibt, wird die Operation stillschweigend übersprungen. Standardmäßig wird ein Fehler ausgelöst.Neu in Version 2.0: Standardmäßig wird ein Fehler ausgelöst, wenn das für den Dictionary-Schlüssel verwendete aufrufbare Objekt
LoaderCallableStatus.NO_VALUEzurückgibt, was im Kontext eines ORM-Attributs ein nicht mit Werten gefülltes Attribut anzeigt. Der Parametermapped_collection.ignore_unpopulated_attributekann gesetzt werden, um stattdessen anzugeben, dass diese Bedingung ignoriert werden soll und die Append-Operation stillschweigend übersprungen wird. Dies steht im Gegensatz zum Verhalten der 1.x-Serie, die den Wert im Dictionary fälschlicherweise mit einem beliebigen Schlüsselwert vonNonegefüllt hätte.
- sqlalchemy.orm.attribute_mapped_collection = <function attribute_keyed_dict>¶
Ein Wörterbuch-basierter Sammlungs-Typ mit Attribut-basierter Schlüsselzuweisung.
Geändert in Version 2.0:
attribute_mapped_collectionumbenannt inattribute_keyed_dict().Gibt eine
KeyFuncDictFabrik zurück, die neue Wörterbuchschlüssel basierend auf dem Wert eines bestimmten benannten Attributs von ORM-abgebildeten Instanzen erzeugt, die dem Wörterbuch hinzugefügt werden sollen.Hinweis
Der Wert des Zielattributs muss zum Zeitpunkt der Hinzufügung des Objekts zur Wörterbuch-Sammlung mit seinem Wert zugewiesen werden. Darüber hinaus werden Änderungen am Schlüsselattribut nicht verfolgt, was bedeutet, dass der Schlüssel im Wörterbuch nicht automatisch mit dem Schlüsselwert des Zielobjekts selbst synchronisiert wird. Weitere Details finden Sie unter Umgang mit Schlüsselmutationen und Rückverfolgung für Wörterbuch-Sammlungen.
Siehe auch
Wörterbuch-Sammlungen - Hintergrund zur Verwendung
- Parameter:
attr_name – Zeichenkettenname eines ORM-gemappten Attributs der gemappten Klasse, dessen Wert bei einer bestimmten Instanz als Schlüssel für einen neuen Dictionary-Eintrag für diese Instanz verwendet wird.
ignore_unpopulated_attribute –
Wenn True und das Zielattribut eines Objekts überhaupt nicht befüllt ist, wird die Operation stillschweigend übersprungen. Standardmäßig wird ein Fehler ausgelöst.
Neu in Version 2.0: Standardmäßig wird ein Fehler ausgelöst, wenn das für den Wörterbuchschlüssel verwendete Attribut ermittelt wird und keinen Wert erhalten hat. Der Parameter
attribute_keyed_dict.ignore_unpopulated_attributekann gesetzt werden, was stattdessen angibt, dass dieser Zustand ignoriert werden soll und die Append-Operation stillschweigend übersprungen wird. Dies steht im Gegensatz zum Verhalten der 1.x-Serie, die den Wert fälschlicherweise im Wörterbuch mit einem willkürlichen Schlüsselwert vonNonebefüllt hätte.
- sqlalchemy.orm.column_mapped_collection = <function column_keyed_dict>¶
Ein Wörterbuch-basierter Sammlungs-Typ mit Spalten-basierter Schlüsselzuweisung.
Geändert in Version 2.0:
column_mapped_collectionumbenannt incolumn_keyed_dict.Gibt eine
KeyFuncDictFabrik zurück, die neue Wörterbuchschlüssel basierend auf dem Wert eines bestimmtenColumn-abgebildeten Attributs von ORM-abgebildeten Instanzen erzeugt, die dem Wörterbuch hinzugefügt werden sollen.Hinweis
Der Wert des Zielattributs muss zum Zeitpunkt der Hinzufügung des Objekts zur Wörterbuch-Sammlung mit seinem Wert zugewiesen werden. Darüber hinaus werden Änderungen am Schlüsselattribut nicht verfolgt, was bedeutet, dass der Schlüssel im Wörterbuch nicht automatisch mit dem Schlüsselwert des Zielobjekts selbst synchronisiert wird. Weitere Details finden Sie unter Umgang mit Schlüsselmutationen und Rückverfolgung für Wörterbuch-Sammlungen.
Siehe auch
Wörterbuch-Sammlungen - Hintergrund zur Verwendung
- Parameter:
mapping_spec – ein
ColumnObjekt, das vom Ziel-Mapper einem bestimmten Attribut der gemappten Klasse zugeordnet werden soll, dessen Wert bei einer bestimmten Instanz als Schlüssel für einen neuen Dictionary-Eintrag für diese Instanz verwendet wird.ignore_unpopulated_attribute –
Wenn True und das durch das angegebene
Column-Zielattribut auf einem Objekt angegebene abgebildete Attribut nicht befüllt ist, wird die Operation stillschweigend übersprungen. Standardmäßig wird ein Fehler ausgelöst.Neu in Version 2.0: Standardmäßig wird ein Fehler ausgelöst, wenn festgestellt wird, dass das als Schlüssel für das Dictionary verwendete Attribut nie mit einem Wert gefüllt wurde. Der Parameter
column_keyed_dict.ignore_unpopulated_attributekann gesetzt werden, um stattdessen anzugeben, dass diese Bedingung ignoriert werden soll und der Append-Vorgang stillschweigend übersprungen wird. Dies steht im Gegensatz zum Verhalten der 1.x-Serie, die den Wert im Dictionary fälschlicherweise mit einem beliebigen Schlüsselwert vonNonegefüllt hätte.
- sqlalchemy.orm.mapped_collection = <function keyfunc_mapping>¶
Ein Wörterbuch-basierter Sammlungs-Typ mit willkürlicher Schlüsselzuweisung.
Geändert in Version 2.0:
mapped_collectionumbenannt inkeyfunc_mapping().Gibt eine
KeyFuncDictFabrik mit einer Schlüsselbildungsfunktion zurück, die aus keyfunc generiert wird, einem aufrufbaren Objekt, das eine Entität entgegennimmt und einen Schlüsselwert zurückgibt.Hinweis
Die gegebene keyfunc wird nur einmal aufgerufen, wenn das Zielobjekt zur Sammlung hinzugefügt wird. Änderungen am effektiven Wert, der von der Funktion zurückgegeben wird, werden nicht verfolgt.
Siehe auch
Wörterbuch-Sammlungen - Hintergrund zur Verwendung
- Parameter:
keyfunc – ein aufrufbares Objekt, dem die ORM-gemappte Instanz übergeben wird, die dann einen neuen Schlüssel für die Verwendung im Dictionary generieren soll. Wenn der zurückgegebene Wert
LoaderCallableStatus.NO_VALUEist, wird ein Fehler ausgelöst.ignore_unpopulated_attribute –
Wenn True und das aufrufbare Objekt für eine bestimmte Instanz
LoaderCallableStatus.NO_VALUEzurückgibt, wird die Operation stillschweigend übersprungen. Standardmäßig wird ein Fehler ausgelöst.Neu in Version 2.0: Standardmäßig wird ein Fehler ausgelöst, wenn das für den Dictionary-Schlüssel verwendete aufrufbare Objekt
LoaderCallableStatus.NO_VALUEzurückgibt, was im Kontext eines ORM-Attributs ein nicht mit Werten gefülltes Attribut anzeigt. Der Parametermapped_collection.ignore_unpopulated_attributekann gesetzt werden, um stattdessen anzugeben, dass diese Bedingung ignoriert werden soll und die Append-Operation stillschweigend übersprungen wird. Dies steht im Gegensatz zum Verhalten der 1.x-Serie, die den Wert im Dictionary fälschlicherweise mit einem beliebigen Schlüsselwert vonNonegefüllt hätte.
- Klasse sqlalchemy.orm.KeyFuncDict¶
Basis für ORM-abgebildete Wörterbuch-Klassen.
Erweitert den Typ
dictum zusätzliche Methoden, die von SQLAlchemy ORM-Sammlungsklassen benötigt werden. Die Verwendung vonKeyFuncDicterfolgt am direktesten über die Klassenfabrikenattribute_keyed_dict()odercolumn_keyed_dict().KeyFuncDictkann auch als Basis für benutzerdefinierte Dictionary-Klassen dienen.Geändert in Version 2.0:
MappedCollectionumbenannt inKeyFuncDict.Siehe auch
Mitglieder
__init__(), clear(), pop(), popitem(), remove(), set(), setdefault(), update()
Klassensignatur
Klasse
sqlalchemy.orm.KeyFuncDict(builtins.dict,typing.Generic)-
methode
sqlalchemy.orm.KeyFuncDict.__init__(keyfunc: Callable[[Any], Any], *dict_args: Any, ignore_unpopulated_attribute: bool = False) → None¶ Erstellt eine neue Sammlung mit Schlüsselbildung durch keyfunc.
keyfunc kann jedes aufrufbare Objekt sein, das ein Objekt entgegennimmt und ein Objekt als Dictionary-Schlüssel zurückgibt.
Die keyfunc wird jedes Mal aufgerufen, wenn der ORM ein Mitglied nur nach Wert hinzufügen (z. B. beim Laden von Instanzen aus der Datenbank) oder ein Mitglied entfernen muss. Die üblichen Vorsichtsmaßnahmen bezüglich Dictionary-Schlüssel gelten –
keyfunc(object)sollte für die Lebensdauer der Sammlung die gleiche Ausgabe zurückgeben. Die Schlüsselbildung basierend auf veränderlichen Eigenschaften kann dazu führen, dass nicht erreichbare Instanzen „verloren“ in der Sammlung gehen.
-
methode
sqlalchemy.orm.KeyFuncDict.clear() → None. Entfernt alle Elemente aus D.¶
-
methode
sqlalchemy.orm.KeyFuncDict.pop(k[, d]) → v, entfernt den angegebenen Schlüssel und gibt den entsprechenden Wert zurück.¶ Wenn der Schlüssel nicht gefunden wird, wird der Standardwert zurückgegeben, falls angegeben; andernfalls wird ein KeyError ausgelöst.
-
methode
sqlalchemy.orm.KeyFuncDict.popitem()¶ Entfernt und gibt ein (Schlüssel, Wert)-Paar als 2-Tupel zurück.
Paare werden in LIFO-Reihenfolge (Last-in, First-out) zurückgegeben. Löst KeyError aus, wenn das Dictionary leer ist.
-
methode
sqlalchemy.orm.KeyFuncDict.remove(value: _KT, _sa_initiator: AttributeEventToken | Literal[None, False] = None) → None¶ Entfernt ein Element nach Wert und konsultiert die keyfunc für den Schlüssel.
-
methode
sqlalchemy.orm.KeyFuncDict.set(value: _KT, _sa_initiator: AttributeEventToken | Literal[None, False] = None) → None¶ Fügt ein Element nach Wert hinzu und konsultiert die keyfunc für den Schlüssel.
-
methode
sqlalchemy.orm.KeyFuncDict.setdefault(key, default=None)¶ Fügt den Schlüssel mit dem Wert `default` ein, wenn der Schlüssel nicht im Dictionary vorhanden ist.
Gibt den Wert für den Schlüssel zurück, wenn der Schlüssel im Dictionary vorhanden ist, andernfalls `default`.
-
methode
sqlalchemy.orm.KeyFuncDict.update([E, ]**F) → None. Aktualisiert D aus dict/iterable E und F.¶ Wenn E vorhanden ist und eine .keys()-Methode hat, dann: for k in E: D[k] = E[k] Wenn E vorhanden ist und keine .keys()-Methode hat, dann: for k, v in E: D[k] = v In beiden Fällen folgt: for k in F: D[k] = F[k]
-
methode
- sqlalchemy.orm.MappedCollection = <class 'sqlalchemy.orm.mapped_collection.KeyFuncDict'>¶
Basis für ORM-abgebildete Wörterbuch-Klassen.
Erweitert den Typ
dictum zusätzliche Methoden, die von SQLAlchemy ORM-Sammlungsklassen benötigt werden. Die Verwendung vonKeyFuncDicterfolgt am direktesten über die Klassenfabrikenattribute_keyed_dict()odercolumn_keyed_dict().KeyFuncDictkann auch als Basis für benutzerdefinierte Dictionary-Klassen dienen.Geändert in Version 2.0:
MappedCollectionumbenannt inKeyFuncDict.
Sammlungsinterne Funktionen¶
| Objektname | Beschreibung |
|---|---|
bulk_replace(values, existing_adapter, new_adapter[, initiator]) |
Lädt eine neue Sammlung und löst Ereignisse basierend auf der vorherigen Mitgliedschaft aus. |
Dekoratoren für Entitätssammlungsklassen. |
|
attrgetter(attr, …) –> attrgetter Objekt |
|
Schnittstellen zwischen dem ORM und beliebigen Python-Sammlungen. |
|
Eine instrumentierte Version des eingebauten dict. |
|
Eine instrumentierte Version der eingebauten list. |
|
Eine instrumentierte Version der eingebauten set. |
|
prepare_instrumentation(factory) |
Bereitet ein aufrufbares Objekt für die zukünftige Verwendung als Sammlungsinstanzfabrik vor. |
- funktion sqlalchemy.orm.collections.bulk_replace(values, existing_adapter, new_adapter, initiator=None)¶
Lädt eine neue Sammlung und löst Ereignisse basierend auf der vorherigen Mitgliedschaft aus.
Fügt Instanzen in
valuesan dennew_adapteran. Ereignisse werden für jede Instanz ausgelöst, die nicht imexisting_adaptervorhanden ist. Instanzen imexisting_adapter, die nicht invaluesvorhanden sind, lösen Entfernungsereignisse aus.- Parameter:
values¶ – Ein Iterable von Sammlungsmitgliedsinstanzen
existing_adapter¶ – Ein
CollectionAdaptervon zu ersetzenden Instanzennew_adapter¶ – Ein leerer
CollectionAdapter, der mitvaluesgefüllt werden soll
- Klasse sqlalchemy.orm.collections.collection¶
Dekoratoren für Entitätssammlungsklassen.
Die Dekoratoren fallen in zwei Gruppen: Annotationen und Abfangrezepte.
Die annotierenden Dekoratoren (appender, remover, iterator, converter, internally_instrumented) geben den Zweck der Methode an und nehmen keine Argumente entgegen. Sie werden nicht mit Klammern geschrieben.
@collection.appender def append(self, append): ...
Die Rezeptdekoratoren erfordern alle Klammern, auch diejenigen, die keine Argumente entgegennehmen.
Mitglieder
adds(), appender(), converter(), internally_instrumented(), iterator(), remover(), removes(), removes_return(), replaces()
@collection.adds("entity") def insert(self, position, entity): ... @collection.removes_return() def popitem(self): ...
-
methode
sqlalchemy.orm.collections.collection.static adds(arg)¶ Markiert die Methode als Hinzufügen einer Entität zur Sammlung.
Fügt der Methode eine „Hinzufügen zur Sammlung“-Behandlung hinzu. Das Dekoratorargument gibt an, welches Methodenargument den SQLAlchemy-relevanten Wert enthält. Argumente können positionell (d.h. ganzzahlig) oder nach Namen angegeben werden.
@collection.adds(1) def push(self, item): ... @collection.adds("entity") def do_stuff(self, thing, entity=None): ...
-
methode
sqlalchemy.orm.collections.collection.static appender(fn)¶ Markiert die Methode als Sammlungsappender.
Die Appender-Methode wird mit einem Positionsargument aufgerufen: dem anzufügenden Wert. Die Methode wird automatisch mit `adds(1)` dekoriert, wenn sie nicht bereits dekoriert ist.
@collection.appender def add(self, append): ... # or, equivalently @collection.appender @collection.adds(1) def add(self, append): ... # for mapping type, an 'append' may kick out a previous value # that occupies that slot. consider d['a'] = 'foo'- any previous # value in d['a'] is discarded. @collection.appender @collection.replaces(1) def add(self, entity): key = some_key_func(entity) previous = None if key in self: previous = self[key] self[key] = entity return previous
Wenn der anzufügende Wert nicht in der Sammlung erlaubt ist, können Sie eine Ausnahme auslösen. Denken Sie daran, dass der Appender für jedes Objekt aufgerufen wird, das durch eine Datenbankabfrage gemappt wird. Wenn die Datenbank Zeilen enthält, die Ihre Sammlungssemantik verletzen, müssen Sie kreativ werden, um das Problem zu lösen, da der Zugriff über die Sammlung nicht funktioniert.
Wenn die Appender-Methode intern instrumentiert ist, müssen Sie auch das Schlüsselwortargument `_sa_initiator` empfangen und seine Verbreitung an Sammlungsereignisse sicherstellen.
-
methode
sqlalchemy.orm.collections.collection.static converter(fn)¶ Markiert die Methode als Sammlungs-Konverter.
Veraltet seit Version 1.3: Der Handler
collection.converter()ist veraltet und wird in einer zukünftigen Version entfernt. Beziehen Sie sich auf die Listener-Schnittstellebulk_replacein Verbindung mit der Funktionlisten().Diese optionale Methode wird aufgerufen, wenn eine Sammlung vollständig ersetzt wird, z. B. bei
myobj.acollection = [newvalue1, newvalue2]
Die Konverter-Methode erhält das zugewiesene Objekt und sollte ein Iterable von Werten zurückgeben, die für die Verwendung durch die
appender-Methode geeignet sind. Ein Konverter darf keine Werte zuweisen oder die Sammlung verändern; seine einzige Aufgabe ist es, den vom Benutzer bereitgestellten Wert in ein Iterable von Werten für die Verwendung durch den ORM anzupassen.Die Standard-Konverter-Implementierung verwendet Duck-Typing für die Konvertierung. Eine Dictionary-ähnliche Sammlung wird in ein Iterable von Dictionary-Werten konvertiert, und andere Typen werden einfach iteriert.
@collection.converter def convert(self, other): ...
Wenn das Duck-Typing des Objekts nicht mit dem Typ dieser Sammlung übereinstimmt, wird ein TypeError ausgelöst.
Stellen Sie eine Implementierung dieser Methode bereit, wenn Sie den Bereich der möglichen Typen erweitern möchten, die in großen Mengen zugewiesen werden können, oder wenn Sie die Werte validieren möchten, die zugewiesen werden sollen.
-
methode
sqlalchemy.orm.collections.collection.static internally_instrumented(fn)¶ Markiert die Methode als instrumentiert.
Dieses Tag verhindert, dass eine Dekoration auf die Methode angewendet wird. Verwenden Sie dies, wenn Sie Ihre eigenen Aufrufe an
collection_adapter()in einer der grundlegenden SQLAlchemy-Schnittstellenmethoden orchestrieren oder verhindern möchten, dass eine automatische ABC-Methodendekoration Ihre Implementierung umschließt.# normally an 'extend' method on a list-like class would be # automatically intercepted and re-implemented in terms of # SQLAlchemy events and append(). your implementation will # never be called, unless: @collection.internally_instrumented def extend(self, items): ...
-
methode
sqlalchemy.orm.collections.collection.static iterator(fn)¶ Markiert die Methode als Sammlungsentferner.
Die Iterator-Methode wird ohne Argumente aufgerufen. Es wird erwartet, dass sie einen Iterator über alle Sammlungsmitglieder zurückgibt.
@collection.iterator def __iter__(self): ...
-
methode
sqlalchemy.orm.collections.collection.static remover(fn)¶ Markiert die Methode als Sammlungsentferner.
Die Remover-Methode wird mit einem Positionsargument aufgerufen: dem zu entfernenden Wert. Die Methode wird automatisch mit
removes_return()dekoriert, wenn sie nicht bereits dekoriert ist.@collection.remover def zap(self, entity): ... # or, equivalently @collection.remover @collection.removes_return() def zap(self): ...
Wenn der zu entfernende Wert nicht in der Sammlung vorhanden ist, können Sie eine Ausnahme auslösen oder `None` zurückgeben, um den Fehler zu ignorieren.
Wenn die Remover-Methode intern instrumentiert ist, müssen Sie auch das Schlüsselwortargument `_sa_initiator` empfangen und seine Verbreitung an Sammlungsereignisse sicherstellen.
-
methode
sqlalchemy.orm.collections.collection.static removes(arg)¶ Markiert die Methode als Entfernen einer Entität aus der Sammlung.
Fügt der Methode eine „Entfernen aus Sammlung“-Behandlung hinzu. Das Dekoratorargument gibt an, welches Methodenargument den zu entfernenden SQLAlchemy-relevanten Wert enthält. Argumente können positionell (d.h. ganzzahlig) oder nach Namen angegeben werden.
@collection.removes(1) def zap(self, item): ...
Für Methoden, bei denen der zu entfernende Wert zum Zeitpunkt des Aufrufs nicht bekannt ist, verwenden Sie collection.removes_return.
-
methode
sqlalchemy.orm.collections.collection.static removes_return()¶ Markiert die Methode als Entfernen einer Entität aus der Sammlung.
Fügt der Methode eine „Entfernen aus Sammlung“-Behandlung hinzu. Der Rückgabewert der Methode wird, falls vorhanden, als zu entfernender Wert betrachtet. Die Methodenargumente werden nicht geprüft.
@collection.removes_return() def pop(self): ...
Für Methoden, bei denen der zu entfernende Wert zum Zeitpunkt des Aufrufs bekannt ist, verwenden Sie collection.remove.
-
methode
sqlalchemy.orm.collections.collection.static replaces(arg)¶ Markiert die Methode als Ersetzen einer Entität in der Sammlung.
Fügt der Methode eine „Hinzufügen zur Sammlung“- und „Entfernen aus Sammlung“-Behandlung hinzu. Das Dekoratorargument gibt an, welches Methodenargument den hinzuzufügenden SQLAlchemy-relevanten Wert enthält, und der Rückgabewert wird, falls vorhanden, als zu entfernender Wert betrachtet.
Argumente können positionell (d.h. ganzzahlig) oder nach Namen angegeben werden.
@collection.replaces(2) def __setitem__(self, index, item): ...
-
methode
- sqlalchemy.orm.collections.collection_adapter = operator.attrgetter('_sa_adapter')¶
attrgetter(attr, …) –> attrgetter Objekt
Gibt ein aufrufbares Objekt zurück, das die angegebenen Attribute von seinem Operanden abruft. Nach f = attrgetter('name') gibt der Aufruf f(r) r.name zurück. Nach g = attrgetter('name', 'date') gibt der Aufruf g(r) (r.name, r.date) zurück. Nach h = attrgetter('name.first', 'name.last') gibt der Aufruf h(r) (r.name.first, r.name.last) zurück.
- Klasse sqlalchemy.orm.collections.CollectionAdapter¶
Schnittstellen zwischen dem ORM und beliebigen Python-Sammlungen.
Proxies grundlegende Sammlungsoperationen (append, remove, iterate) an die zugrunde liegende Python-Sammlung und sendet add/remove-Ereignisse für Entitäten, die in die Sammlung eintreten oder sie verlassen.
Der ORM verwendet
CollectionAdapterausschließlich für die Interaktion mit Entitätssammlungen.
- Klasse sqlalchemy.orm.collections.InstrumentedDict¶
Eine instrumentierte Version des eingebauten dict.
Klassensignatur
Klasse
sqlalchemy.orm.collections.InstrumentedDict(builtins.dict,typing.Generic)
- Klasse sqlalchemy.orm.collections.InstrumentedList¶
Eine instrumentierte Version der eingebauten list.
Klassensignatur
Klasse
sqlalchemy.orm.collections.InstrumentedList(builtins.list,typing.Generic)
- Klasse sqlalchemy.orm.collections.InstrumentedSet¶
Eine instrumentierte Version der eingebauten set.
Klassensignatur
class
sqlalchemy.orm.collections.InstrumentedSet(builtins.set,typing.Generic)
- function sqlalchemy.orm.collections.prepare_instrumentation(factory: Type[Collection[Any]] | Callable[[], _AdaptedCollectionProtocol]) → Callable[[], _AdaptedCollectionProtocol]¶
Bereitet ein aufrufbares Objekt für die zukünftige Verwendung als Sammlungsinstanzfabrik vor.
Gibt eine Collection-Klassenfabrik (entweder ein Typ oder ein Aufruf ohne Argumente) zurück. Diese liefert kompatible Instanzen, wenn sie aufgerufen wird.
Diese Funktion ist dafür verantwortlich, collection_class=list in das Laufzeitverhalten von collection_class=InstrumentedList umzuwandeln.
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