SQLAlchemy 2.0 Dokumentation
SQLAlchemy ORM
- ORM Schnellstart
- ORM Abgebildete Klassenkonfiguration
- Beziehungskonfiguration
- ORM Abfragehandbuch
- Verwendung der Sitzung
- Ereignisse und Interna
- ORM Erweiterungen
- Asynchrone E/A (asyncio)¶
- Installationshinweise für die Asyncio-Plattform (einschließlich Apple M1)
- Übersicht - Core
- Übersicht - ORM
- Ereignisse mit der asyncio-Erweiterung verwenden
- Mehrere asyncio-Event-Loops verwenden
- Scoping Session mit asyncio verwenden
- Der Inspector zur Inspektion von Schemaobjekten
- Engine API Dokumentation
create_async_engine()async_engine_from_config()create_async_pool_from_url()AsyncEngineAsyncEngine.begin()AsyncEngine.clear_compiled_cache()AsyncEngine.connect()AsyncEngine.dialectAsyncEngine.dispose()AsyncEngine.driverAsyncEngine.echoAsyncEngine.engineAsyncEngine.execution_options()AsyncEngine.get_execution_options()AsyncEngine.nameAsyncEngine.poolAsyncEngine.raw_connection()AsyncEngine.sync_engineAsyncEngine.update_execution_options()AsyncEngine.url
AsyncConnectionAsyncConnection.aclose()AsyncConnection.begin()AsyncConnection.begin_nested()AsyncConnection.close()AsyncConnection.closedAsyncConnection.commit()AsyncConnection.connectionAsyncConnection.default_isolation_levelAsyncConnection.dialectAsyncConnection.exec_driver_sql()AsyncConnection.execute()AsyncConnection.execution_options()AsyncConnection.get_nested_transaction()AsyncConnection.get_raw_connection()AsyncConnection.get_transaction()AsyncConnection.in_nested_transaction()AsyncConnection.in_transaction()AsyncConnection.infoAsyncConnection.invalidate()AsyncConnection.invalidatedAsyncConnection.rollback()AsyncConnection.run_sync()AsyncConnection.scalar()AsyncConnection.scalars()AsyncConnection.start()AsyncConnection.stream()AsyncConnection.stream_scalars()AsyncConnection.sync_connectionAsyncConnection.sync_engine
AsyncTransaction
- Result Set API Dokumentation
AsyncResultAsyncResult.all()AsyncResult.close()AsyncResult.closedAsyncResult.columns()AsyncResult.fetchall()AsyncResult.fetchmany()AsyncResult.fetchone()AsyncResult.first()AsyncResult.freeze()AsyncResult.keys()AsyncResult.mappings()AsyncResult.one()AsyncResult.one_or_none()AsyncResult.partitions()AsyncResult.scalar()AsyncResult.scalar_one()AsyncResult.scalar_one_or_none()AsyncResult.scalars()AsyncResult.tAsyncResult.tuples()AsyncResult.unique()AsyncResult.yield_per()
AsyncScalarResultAsyncScalarResult.all()AsyncScalarResult.close()AsyncScalarResult.closedAsyncScalarResult.fetchall()AsyncScalarResult.fetchmany()AsyncScalarResult.first()AsyncScalarResult.one()AsyncScalarResult.one_or_none()AsyncScalarResult.partitions()AsyncScalarResult.unique()AsyncScalarResult.yield_per()
AsyncMappingResultAsyncMappingResult.all()AsyncMappingResult.close()AsyncMappingResult.closedAsyncMappingResult.columns()AsyncMappingResult.fetchall()AsyncMappingResult.fetchmany()AsyncMappingResult.fetchone()AsyncMappingResult.first()AsyncMappingResult.keys()AsyncMappingResult.one()AsyncMappingResult.one_or_none()AsyncMappingResult.partitions()AsyncMappingResult.unique()AsyncMappingResult.yield_per()
AsyncTupleResult
- ORM Session API Dokumentation
async_object_session()async_session()close_all_sessions()async_sessionmakerasync_scoped_sessionasync_scoped_session.__call__()async_scoped_session.__init__()async_scoped_session.aclose()async_scoped_session.add()async_scoped_session.add_all()async_scoped_session.autoflushasync_scoped_session.begin()async_scoped_session.begin_nested()async_scoped_session.bindasync_scoped_session.close()async_scoped_session.close_all()async_scoped_session.commit()async_scoped_session.configure()async_scoped_session.connection()async_scoped_session.delete()async_scoped_session.deletedasync_scoped_session.dirtyasync_scoped_session.execute()async_scoped_session.expire()async_scoped_session.expire_all()async_scoped_session.expunge()async_scoped_session.expunge_all()async_scoped_session.flush()async_scoped_session.get()async_scoped_session.get_bind()async_scoped_session.get_one()async_scoped_session.identity_key()async_scoped_session.identity_mapasync_scoped_session.infoasync_scoped_session.invalidate()async_scoped_session.is_activeasync_scoped_session.is_modified()async_scoped_session.merge()async_scoped_session.newasync_scoped_session.no_autoflushasync_scoped_session.object_session()async_scoped_session.refresh()async_scoped_session.remove()async_scoped_session.reset()async_scoped_session.rollback()async_scoped_session.scalar()async_scoped_session.scalars()async_scoped_session.session_factoryasync_scoped_session.stream()async_scoped_session.stream_scalars()
AsyncAttrsAsyncSessionAsyncSession.sync_session_classAsyncSession.__init__()AsyncSession.aclose()AsyncSession.add()AsyncSession.add_all()AsyncSession.autoflushAsyncSession.begin()AsyncSession.begin_nested()AsyncSession.close()AsyncSession.close_all()AsyncSession.commit()AsyncSession.connection()AsyncSession.delete()AsyncSession.deletedAsyncSession.dirtyAsyncSession.execute()AsyncSession.expire()AsyncSession.expire_all()AsyncSession.expunge()AsyncSession.expunge_all()AsyncSession.flush()AsyncSession.get()AsyncSession.get_bind()AsyncSession.get_nested_transaction()AsyncSession.get_one()AsyncSession.get_transaction()AsyncSession.identity_key()AsyncSession.identity_mapAsyncSession.in_nested_transaction()AsyncSession.in_transaction()AsyncSession.infoAsyncSession.invalidate()AsyncSession.is_activeAsyncSession.is_modified()AsyncSession.merge()AsyncSession.newAsyncSession.no_autoflushAsyncSession.object_session()AsyncSession.refresh()AsyncSession.reset()AsyncSession.rollback()AsyncSession.run_sync()AsyncSession.scalar()AsyncSession.scalars()AsyncSession.stream()AsyncSession.stream_scalars()AsyncSession.sync_session
AsyncSessionTransaction
- Assoziationsproxy
- Automap
- Baked Queries
- Deklarative Erweiterungen
- Mypy / Pep-484 Unterstützung für ORM-Mappings
- Mutationsverfolgung
- Sortierungsliste
- Horizontale Sharding
- Hybrid-Attribute
- Indexierbar
- Alternative Klassen-Instrumentierung
- Asynchrone E/A (asyncio)¶
- ORM Beispiele
Projektversionen
- Vorherige: ORM-Erweiterungen
- Nächste: Association Proxy
- Oben: Startseite
- Auf dieser Seite
- Asynchrone E/A (asyncio)
- Installationshinweise für die Asyncio-Plattform (einschließlich Apple M1)
- Übersicht - Core
- Übersicht - ORM
- Ereignisse mit der asyncio-Erweiterung verwenden
- Mehrere asyncio-Event-Loops verwenden
- Scoping Session mit asyncio verwenden
- Der Inspector zur Inspektion von Schemaobjekten
- Engine API Dokumentation
create_async_engine()async_engine_from_config()create_async_pool_from_url()AsyncEngineAsyncEngine.begin()AsyncEngine.clear_compiled_cache()AsyncEngine.connect()AsyncEngine.dialectAsyncEngine.dispose()AsyncEngine.driverAsyncEngine.echoAsyncEngine.engineAsyncEngine.execution_options()AsyncEngine.get_execution_options()AsyncEngine.nameAsyncEngine.poolAsyncEngine.raw_connection()AsyncEngine.sync_engineAsyncEngine.update_execution_options()AsyncEngine.url
AsyncConnectionAsyncConnection.aclose()AsyncConnection.begin()AsyncConnection.begin_nested()AsyncConnection.close()AsyncConnection.closedAsyncConnection.commit()AsyncConnection.connectionAsyncConnection.default_isolation_levelAsyncConnection.dialectAsyncConnection.exec_driver_sql()AsyncConnection.execute()AsyncConnection.execution_options()AsyncConnection.get_nested_transaction()AsyncConnection.get_raw_connection()AsyncConnection.get_transaction()AsyncConnection.in_nested_transaction()AsyncConnection.in_transaction()AsyncConnection.infoAsyncConnection.invalidate()AsyncConnection.invalidatedAsyncConnection.rollback()AsyncConnection.run_sync()AsyncConnection.scalar()AsyncConnection.scalars()AsyncConnection.start()AsyncConnection.stream()AsyncConnection.stream_scalars()AsyncConnection.sync_connectionAsyncConnection.sync_engine
AsyncTransaction
- Result Set API Dokumentation
AsyncResultAsyncResult.all()AsyncResult.close()AsyncResult.closedAsyncResult.columns()AsyncResult.fetchall()AsyncResult.fetchmany()AsyncResult.fetchone()AsyncResult.first()AsyncResult.freeze()AsyncResult.keys()AsyncResult.mappings()AsyncResult.one()AsyncResult.one_or_none()AsyncResult.partitions()AsyncResult.scalar()AsyncResult.scalar_one()AsyncResult.scalar_one_or_none()AsyncResult.scalars()AsyncResult.tAsyncResult.tuples()AsyncResult.unique()AsyncResult.yield_per()
AsyncScalarResultAsyncScalarResult.all()AsyncScalarResult.close()AsyncScalarResult.closedAsyncScalarResult.fetchall()AsyncScalarResult.fetchmany()AsyncScalarResult.first()AsyncScalarResult.one()AsyncScalarResult.one_or_none()AsyncScalarResult.partitions()AsyncScalarResult.unique()AsyncScalarResult.yield_per()
AsyncMappingResultAsyncMappingResult.all()AsyncMappingResult.close()AsyncMappingResult.closedAsyncMappingResult.columns()AsyncMappingResult.fetchall()AsyncMappingResult.fetchmany()AsyncMappingResult.fetchone()AsyncMappingResult.first()AsyncMappingResult.keys()AsyncMappingResult.one()AsyncMappingResult.one_or_none()AsyncMappingResult.partitions()AsyncMappingResult.unique()AsyncMappingResult.yield_per()
AsyncTupleResult
- ORM Session API Dokumentation
async_object_session()async_session()close_all_sessions()async_sessionmakerasync_scoped_sessionasync_scoped_session.__call__()async_scoped_session.__init__()async_scoped_session.aclose()async_scoped_session.add()async_scoped_session.add_all()async_scoped_session.autoflushasync_scoped_session.begin()async_scoped_session.begin_nested()async_scoped_session.bindasync_scoped_session.close()async_scoped_session.close_all()async_scoped_session.commit()async_scoped_session.configure()async_scoped_session.connection()async_scoped_session.delete()async_scoped_session.deletedasync_scoped_session.dirtyasync_scoped_session.execute()async_scoped_session.expire()async_scoped_session.expire_all()async_scoped_session.expunge()async_scoped_session.expunge_all()async_scoped_session.flush()async_scoped_session.get()async_scoped_session.get_bind()async_scoped_session.get_one()async_scoped_session.identity_key()async_scoped_session.identity_mapasync_scoped_session.infoasync_scoped_session.invalidate()async_scoped_session.is_activeasync_scoped_session.is_modified()async_scoped_session.merge()async_scoped_session.newasync_scoped_session.no_autoflushasync_scoped_session.object_session()async_scoped_session.refresh()async_scoped_session.remove()async_scoped_session.reset()async_scoped_session.rollback()async_scoped_session.scalar()async_scoped_session.scalars()async_scoped_session.session_factoryasync_scoped_session.stream()async_scoped_session.stream_scalars()
AsyncAttrsAsyncSessionAsyncSession.sync_session_classAsyncSession.__init__()AsyncSession.aclose()AsyncSession.add()AsyncSession.add_all()AsyncSession.autoflushAsyncSession.begin()AsyncSession.begin_nested()AsyncSession.close()AsyncSession.close_all()AsyncSession.commit()AsyncSession.connection()AsyncSession.delete()AsyncSession.deletedAsyncSession.dirtyAsyncSession.execute()AsyncSession.expire()AsyncSession.expire_all()AsyncSession.expunge()AsyncSession.expunge_all()AsyncSession.flush()AsyncSession.get()AsyncSession.get_bind()AsyncSession.get_nested_transaction()AsyncSession.get_one()AsyncSession.get_transaction()AsyncSession.identity_key()AsyncSession.identity_mapAsyncSession.in_nested_transaction()AsyncSession.in_transaction()AsyncSession.infoAsyncSession.invalidate()AsyncSession.is_activeAsyncSession.is_modified()AsyncSession.merge()AsyncSession.newAsyncSession.no_autoflushAsyncSession.object_session()AsyncSession.refresh()AsyncSession.reset()AsyncSession.rollback()AsyncSession.run_sync()AsyncSession.scalar()AsyncSession.scalars()AsyncSession.stream()AsyncSession.stream_scalars()AsyncSession.sync_session
AsyncSessionTransaction
Asynchrone E/A (asyncio)¶
Unterstützung für Python asyncio. Unterstützung für Core und ORM ist enthalten, wobei asyncio-kompatible Dialekte verwendet werden.
Neu in Version 1.4.
Warnung
Bitte lesen Sie Installationshinweise für die Asyncio-Plattform (einschließlich Apple M1) für wichtige Installationshinweise für viele Plattformen, einschließlich der Apple M1-Architektur.
Siehe auch
Asynchrone E/A-Unterstützung für Core und ORM - ursprüngliche Feature-Ankündigung
Asyncio-Integration - Beispielskripte, die funktionierende Beispiele für Core- und ORM-Nutzung innerhalb der asyncio-Erweiterung veranschaulichen.
Installationshinweise für die Asyncio-Plattform (einschließlich Apple M1)¶
Die asyncio-Erweiterung erfordert nur Python 3. Sie hängt auch von der greenlet-Bibliothek ab. Diese Abhängigkeit wird standardmäßig auf gängigen Maschinenplattformen installiert, einschließlich
x86_64 aarch64 ppc64le amd64 win32Für die oben genannten Plattformen ist bekannt, dass greenlet vorkompilierte Wheel-Dateien bereitstellt. Für andere Plattformen installiert greenlet nicht standardmäßig. Die aktuelle Dateiliste für greenlet finden Sie unter Greenlet - Download Files. Beachten Sie, dass viele Architekturen weggelassen werden, einschließlich Apple M1.
Um SQLAlchemy zu installieren und sicherzustellen, dass die Abhängigkeit greenlet unabhängig von der verwendeten Plattform vorhanden ist, kann das [asyncio] setuptools extra wie folgt installiert werden, was auch pip anweist, greenlet zu installieren:
pip install sqlalchemy[asyncio]Beachten Sie, dass die Installation von greenlet auf Plattformen, die keine vorkompilierte Wheel-Datei haben, bedeutet, dass greenlet aus dem Quellcode erstellt wird, was erfordert, dass auch die Entwicklungsbibliotheken von Python vorhanden sind.
Übersicht - Core¶
Für die Core-Nutzung erstellt die Funktion create_async_engine() eine Instanz von AsyncEngine, die dann eine asynchrone Version der traditionellen Engine-API bietet. Die AsyncEngine liefert eine AsyncConnection über ihre Methoden AsyncEngine.connect() und AsyncEngine.begin(), die beide asynchrone Kontextmanager liefern. Die AsyncConnection kann dann Anweisungen entweder mit der Methode AsyncConnection.execute() aufrufen, um ein gepuffertes Result zu liefern, oder mit der Methode AsyncConnection.stream(), um ein Streaming-Server-seitiges AsyncResult zu liefern.
>>> import asyncio
>>> from sqlalchemy import Column
>>> from sqlalchemy import MetaData
>>> from sqlalchemy import select
>>> from sqlalchemy import String
>>> from sqlalchemy import Table
>>> from sqlalchemy.ext.asyncio import create_async_engine
>>> meta = MetaData()
>>> t1 = Table("t1", meta, Column("name", String(50), primary_key=True))
>>> async def async_main() -> None:
... engine = create_async_engine("sqlite+aiosqlite://", echo=True)
...
... async with engine.begin() as conn:
... await conn.run_sync(meta.drop_all)
... await conn.run_sync(meta.create_all)
...
... await conn.execute(
... t1.insert(), [{"name": "some name 1"}, {"name": "some name 2"}]
... )
...
... async with engine.connect() as conn:
... # select a Result, which will be delivered with buffered
... # results
... result = await conn.execute(select(t1).where(t1.c.name == "some name 1"))
...
... print(result.fetchall())
...
... # for AsyncEngine created in function scope, close and
... # clean-up pooled connections
... await engine.dispose()
>>> asyncio.run(async_main())
BEGIN (implicit)
...
CREATE TABLE t1 (
name VARCHAR(50) NOT NULL,
PRIMARY KEY (name)
)
...
INSERT INTO t1 (name) VALUES (?)
[...] [('some name 1',), ('some name 2',)]
COMMIT
BEGIN (implicit)
SELECT t1.name
FROM t1
WHERE t1.name = ?
[...] ('some name 1',)
[('some name 1',)]
ROLLBACK
Oben kann die Methode AsyncConnection.run_sync() verwendet werden, um spezielle DDL-Funktionen wie MetaData.create_all() aufzurufen, die keinen awaitable Hook enthalten.
Tipp
Es ist ratsam, die Methode AsyncEngine.dispose() mit await aufzurufen, wenn das Objekt AsyncEngine in einem Gültigkeitsbereich verwendet wird, der den Kontext verlässt und vom Garbage Collector bereinigt wird, wie in der Funktion async_main im obigen Beispiel gezeigt. Dies stellt sicher, dass alle vom Connection Pool gehaltenen Verbindungen in einem awaitable Kontext ordnungsgemäß freigegeben werden. Im Gegensatz zur Verwendung von Blocking IO kann SQLAlchemy diese Verbindungen nicht ordnungsgemäß in Methoden wie __del__ oder Weakref-Finalizern freigeben, da keine Möglichkeit besteht, await aufzurufen. Wenn Sie die Engine beim Verlassen des Gültigkeitsbereichs nicht explizit freigeben, können Warnungen an die Standardausgabe ausgegeben werden, die der Form RuntimeError: Event loop is closed ähneln.
Die AsyncConnection verfügt auch über eine "Streaming"-API über die Methode AsyncConnection.stream(), die ein Objekt vom Typ AsyncResult zurückgibt. Dieses Ergebnisobjekt verwendet einen serverseitigen Cursor und bietet eine async/await-API, wie z. B. einen asynchronen Iterator.
async with engine.connect() as conn:
async_result = await conn.stream(select(t1))
async for row in async_result:
print("row: %s" % (row,))Übersicht - ORM¶
Unter Verwendung der 2.0-Style-Abfragen bietet die Klasse AsyncSession die vollständige ORM-Funktionalität.
Im Standardnutzungsmodus muss besondere Vorsicht walten, um Lazy Loading oder andere abgelaufene Attributzugriffe im Zusammenhang mit ORM-Beziehungen und Spaltenattributen zu vermeiden. Der nächste Abschnitt Implizite E/A bei Verwendung von AsyncSession vermeiden erläutert dies.
Warnung
Eine einzelne Instanz von AsyncSession ist nicht sicher für die Verwendung in mehreren, gleichzeitigen Aufgaben. Lesen Sie die Abschnitte AsyncSession mit gleichzeitigen Aufgaben verwenden und Ist die Session Thread-sicher? Ist AsyncSession sicher für die gemeinsame Nutzung in gleichzeitigen Aufgaben? für Hintergrundinformationen.
Das folgende Beispiel veranschaulicht ein vollständiges Beispiel einschließlich Mapper- und Session-Konfiguration
>>> from __future__ import annotations
>>> import asyncio
>>> import datetime
>>> from typing import List
>>> from sqlalchemy import ForeignKey
>>> from sqlalchemy import func
>>> from sqlalchemy import select
>>> from sqlalchemy.ext.asyncio import AsyncAttrs
>>> from sqlalchemy.ext.asyncio import async_sessionmaker
>>> from sqlalchemy.ext.asyncio import AsyncSession
>>> from sqlalchemy.ext.asyncio import create_async_engine
>>> from sqlalchemy.orm import DeclarativeBase
>>> from sqlalchemy.orm import Mapped
>>> from sqlalchemy.orm import mapped_column
>>> from sqlalchemy.orm import relationship
>>> from sqlalchemy.orm import selectinload
>>> class Base(AsyncAttrs, DeclarativeBase):
... pass
>>> 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]
>>> class A(Base):
... __tablename__ = "a"
...
... id: Mapped[int] = mapped_column(primary_key=True)
... data: Mapped[str]
... create_date: Mapped[datetime.datetime] = mapped_column(server_default=func.now())
... bs: Mapped[List[B]] = relationship()
>>> async def insert_objects(async_session: async_sessionmaker[AsyncSession]) -> None:
... async with async_session() as session:
... async with session.begin():
... session.add_all(
... [
... A(bs=[B(data="b1"), B(data="b2")], data="a1"),
... A(bs=[], data="a2"),
... A(bs=[B(data="b3"), B(data="b4")], data="a3"),
... ]
... )
>>> async def select_and_update_objects(
... async_session: async_sessionmaker[AsyncSession],
... ) -> None:
... async with async_session() as session:
... stmt = select(A).order_by(A.id).options(selectinload(A.bs))
...
... result = await session.execute(stmt)
...
... for a in result.scalars():
... print(a, a.data)
... print(f"created at: {a.create_date}")
... for b in a.bs:
... print(b, b.data)
...
... result = await session.execute(select(A).order_by(A.id).limit(1))
...
... a1 = result.scalars().one()
...
... a1.data = "new data"
...
... await session.commit()
...
... # access attribute subsequent to commit; this is what
... # expire_on_commit=False allows
... print(a1.data)
...
... # alternatively, AsyncAttrs may be used to access any attribute
... # as an awaitable (new in 2.0.13)
... for b1 in await a1.awaitable_attrs.bs:
... print(b1, b1.data)
>>> async def async_main() -> None:
... engine = create_async_engine("sqlite+aiosqlite://", echo=True)
...
... # async_sessionmaker: a factory for new AsyncSession objects.
... # expire_on_commit - don't expire objects after transaction commit
... async_session = async_sessionmaker(engine, expire_on_commit=False)
...
... async with engine.begin() as conn:
... await conn.run_sync(Base.metadata.create_all)
...
... await insert_objects(async_session)
... await select_and_update_objects(async_session)
...
... # for AsyncEngine created in function scope, close and
... # clean-up pooled connections
... await engine.dispose()
>>> asyncio.run(async_main())
BEGIN (implicit)
...
CREATE TABLE a (
id INTEGER NOT NULL,
data VARCHAR NOT NULL,
create_date DATETIME DEFAULT (CURRENT_TIMESTAMP) NOT NULL,
PRIMARY KEY (id)
)
...
CREATE TABLE b (
id INTEGER NOT NULL,
a_id INTEGER NOT NULL,
data VARCHAR NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY(a_id) REFERENCES a (id)
)
...
COMMIT
BEGIN (implicit)
INSERT INTO a (data) VALUES (?) RETURNING id, create_date
[...] ('a1',)
...
INSERT INTO b (a_id, data) VALUES (?, ?) RETURNING id
[...] (1, 'b2')
...
COMMIT
BEGIN (implicit)
SELECT a.id, a.data, a.create_date
FROM a ORDER BY a.id
[...] ()
SELECT b.a_id AS b_a_id, b.id AS b_id, b.data AS b_data
FROM b
WHERE b.a_id IN (?, ?, ?)
[...] (1, 2, 3)
<A object at ...> a1
created at: ...
<B object at ...> b1
<B object at ...> b2
<A object at ...> a2
created at: ...
<A object at ...> a3
created at: ...
<B object at ...> b3
<B object at ...> b4
SELECT a.id, a.data, a.create_date
FROM a ORDER BY a.id
LIMIT ? OFFSET ?
[...] (1, 0)
UPDATE a SET data=? WHERE a.id = ?
[...] ('new data', 1)
COMMIT
new data
<B object at ...> b1
<B object at ...> b2
Im obigen Beispiel wird die AsyncSession mit dem optionalen Helfer async_sessionmaker instanziiert. Dieser stellt eine Factory für neue AsyncSession-Objekte mit einem festen Satz von Parametern bereit, der hier die Zuordnung zu einer AsyncEngine auf eine bestimmte Datenbank-URL beinhaltet. Diese wird dann an andere Methoden übergeben, wo sie in einem asynchronen Python-Kontextmanager (d. h. einer async with:-Anweisung) verwendet werden kann, sodass sie am Ende des Blocks automatisch geschlossen wird; dies entspricht dem Aufruf der Methode AsyncSession.close().
AsyncSession mit gleichzeitigen Aufgaben verwenden¶
Das Objekt AsyncSession ist ein veränderliches, zustandsbehaftetes Objekt, das eine einzelne, zustandsbehaftete Datenbanktransaktion im Gange darstellt. Bei der Verwendung von gleichzeitigen Aufgaben mit asyncio, z. B. mit APIs wie asyncio.gather(), sollte eine separate AsyncSession pro einzelner Aufgabe verwendet werden.
Siehe den Abschnitt Ist die Session Thread-sicher? Ist AsyncSession sicher für die gemeinsame Nutzung in gleichzeitigen Aufgaben? für eine allgemeine Beschreibung der Session und AsyncSession in Bezug darauf, wie sie mit gleichzeitigen Workloads verwendet werden sollten.
Implizite E/A bei Verwendung von AsyncSession vermeiden¶
Bei der Verwendung von traditionellem asyncio muss die Anwendung Punkte vermeiden, an denen E/A-Zugriffe auf Attribute auftreten können. Techniken, die dabei helfen können, sind unten aufgeführt, viele davon sind im vorherigen Beispiel veranschaulicht.
Attribute, die Lazy-Loading-Beziehungen, verzögerte Spalten oder Ausdrücke sind, oder die in Ablauf-Szenarien abgerufen werden, können von der
AsyncAttrsMixin profitieren. Dieser Mixin, wenn er einer bestimmten Klasse oder allgemeiner der deklarativenBase-Superklasse hinzugefügt wird, bietet einen Zugriffs-AccessorAsyncAttrs.awaitable_attrs, der jedes Attribut als awaitable liefert.from __future__ import annotations from typing import List from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import Mapped from sqlalchemy.orm import relationship class Base(AsyncAttrs, DeclarativeBase): pass class A(Base): __tablename__ = "a" # ... rest of mapping ... bs: Mapped[List[B]] = relationship() class B(Base): __tablename__ = "b" # ... rest of mapping ...
Der Zugriff auf die Sammlung
A.bsbei neu geladenen Instanzen vonA, wenn kein Eager Loading verwendet wird, führt normalerweise zu Lazy Loading, was, um erfolgreich zu sein, normalerweise E/A an die Datenbank sendet, was unter asyncio fehlschlägt, da keine implizite E/A erlaubt ist. Um auf dieses Attribut direkt unter asyncio zuzugreifen, ohne vorherige Ladevorgänge, kann das Attribut als awaitable abgerufen werden, indem das PräfixAsyncAttrs.awaitable_attrsverwendet wird.a1 = (await session.scalars(select(A))).one() for b1 in await a1.awaitable_attrs.bs: print(b1)
Der Mixin
AsyncAttrsbietet eine prägnante Fassade über den internen Ansatz, der auch von der MethodeAsyncSession.run_sync()verwendet wird.Neu in Version 2.0.13.
Siehe auch
Sammlungen können durch nur schreibbare Sammlungen ersetzt werden, die niemals implizit E/A emittieren, indem die Funktion Nur-schreibbare Beziehungen in SQLAlchemy 2.0 verwendet wird. Bei Verwendung dieser Funktion werden Sammlungen nie gelesen, sondern nur mit expliziten SQL-Aufrufen abgefragt. Sehen Sie das Beispiel
async_orm_writeonly.pyim Abschnitt Asyncio-Integration für ein Beispiel von nur schreibbaren Sammlungen, die mit asyncio verwendet werden.Bei der Verwendung von nur schreibbaren Sammlungen ist das Verhalten des Programms in Bezug auf Sammlungen einfach und leicht vorhersehbar. Der Nachteil ist jedoch, dass kein integriertes System zum gleichzeitigen Laden vieler dieser Sammlungen vorhanden ist, was stattdessen manuell erfolgen müsste. Daher behandeln viele der unten aufgeführten Punkte spezifische Techniken bei der Verwendung traditioneller Lazy-Loading-Beziehungen mit asyncio, was mehr Sorgfalt erfordert.
Wenn
AsyncAttrsnicht verwendet wird, können Beziehungen mitlazy="raise"deklariert werden, so dass sie standardmäßig keine SQL emittieren. Um Sammlungen zu laden, würde stattdessen Eager Loading verwendet.Die nützlichste Eager-Loading-Strategie ist der
selectinload()-Eager-Loader, der im vorherigen Beispiel verwendet wird, um die SammlungA.bsim Gültigkeitsbereich des Aufrufsawait session.execute()eager zu laden.stmt = select(A).options(selectinload(A.bs))
Beim Erstellen neuer Objekte werden Sammlungen immer eine standardmäßige, leere Sammlung zugewiesen, z. B. eine Liste im obigen Beispiel.
A(bs=[], data="a2")
Dies ermöglicht es der Sammlung
.bsauf dem obigen ObjektAvorhanden und lesbar zu sein, wenn das ObjektAgeleert wird. Andernfalls wäre.bsentladen, wennAgeleert wird, und würde beim Zugriff einen Fehler auslösen.Die
AsyncSessionwird mitSession.expire_on_commitauf False gesetzt konfiguriert, sodass wir auf Attribute eines Objekts nach einem Aufruf vonAsyncSession.commit()zugreifen können, wie in der Zeile am Ende, wo wir auf ein Attribut zugreifen.# create AsyncSession with expire_on_commit=False async_session = AsyncSession(engine, expire_on_commit=False) # sessionmaker version async_session = async_sessionmaker(engine, expire_on_commit=False) async with async_session() as session: result = await session.execute(select(A).order_by(A.id)) a1 = result.scalars().first() # commit would normally expire all attributes await session.commit() # access attribute subsequent to commit; this is what # expire_on_commit=False allows print(a1.data)
Weitere Richtlinien sind:
Methoden wie
AsyncSession.expire()sollten zugunsten vonAsyncSession.refresh()vermieden werden; falls eine Ablauf notwendig ist. Eine Ablauf sollte im Allgemeinen nicht benötigt werden, daSession.expire_on_commitnormalerweise aufFalsegesetzt werden sollte, wenn asyncio verwendet wird.Eine Lazy-Loading-Beziehung kann explizit unter asyncio geladen werden, indem
AsyncSession.refresh()verwendet wird, falls der gewünschte Attributname explizit anSession.refresh.attribute_namesübergeben wird, z. B.# assume a_obj is an A that has lazy loaded A.bs collection a_obj = await async_session.get(A, [1]) # force the collection to load by naming it in attribute_names await async_session.refresh(a_obj, ["bs"]) # collection is present print(f"bs collection: {a_obj.bs}")
Es ist natürlich vorzuziehen, Eager Loading im Voraus zu verwenden, um Sammlungen bereits eingerichtet zu haben, ohne die Notwendigkeit von Lazy Loading.
Neu in Version 2.0.4: Unterstützung für
AsyncSession.refresh()und die zugrundeliegende MethodeSession.refresh()hinzugefügt, um Lazy-Loading-Beziehungen zu erzwingen, wenn sie explizit im ParameterSession.refresh.attribute_namesgenannt werden. In früheren Versionen wurde die Beziehung stillschweigend übersprungen, auch wenn sie im Parameter genannt wurde.Vermeiden Sie die Verwendung der
all-Kaskadenoption, die unter Kaskaden dokumentiert ist, und listen Sie stattdessen die gewünschten Kaskadenfunktionen explizit auf. Die Optionall-Kaskade beinhaltet unter anderem die Einstellung refresh-expire, was bedeutet, dass die MethodeAsyncSession.refresh()die Attribute von verwandten Objekten ablaufen lässt, aber diese verwandten Objekte nicht unbedingt aktualisiert, vorausgesetzt, Eager Loading ist nicht in derrelationship()konfiguriert, und lässt sie in einem abgelaufenen Zustand zurück.Geeignete Ladeoptionen sollten für
deferred()-Spalten, falls überhaupt verwendet, zusätzlich zu denen vonrelationship()-Konstrukten wie oben erwähnt, verwendet werden. Siehe Begrenzung, welche Spalten mit Spaltenverzögerung geladen werden für Hintergrundinformationen zur Spaltenverzögerung.
Die unter Dynamische Beziehungs-Loader beschriebene "dynamische" Beziehungs-Loader-Strategie ist standardmäßig nicht mit dem asyncio-Ansatz kompatibel. Sie kann direkt nur verwendet werden, wenn sie innerhalb der Methode
AsyncSession.run_sync()aufgerufen wird, die unter Synchrone Methoden und Funktionen unter asyncio ausführen beschrieben ist, oder durch Verwendung ihres Attributs.statement, um ein normales Select zu erhalten.user = await session.get(User, 42) addresses = (await session.scalars(user.addresses.statement)).all() stmt = user.addresses.statement.where(Address.email_address.startswith("patrick")) addresses_filter = (await session.scalars(stmt)).all()
Die "Nur-schreibbare" Technik, die in Version 2.0 von SQLAlchemy eingeführt wurde, ist vollständig mit asyncio kompatibel und sollte bevorzugt werden.
Siehe auch
„Dynamische“ Beziehungs-Loader durch „Nur-schreibbare“ ersetzt - Hinweise zur Migration auf 2.0-Stil
Wenn asyncio mit einer Datenbank verwendet wird, die RETURNING nicht unterstützt, wie z. B. MySQL 8, sind serverseitige Standardwerte wie generierte Zeitstempel nicht auf neu geleerten Objekten verfügbar, es sei denn, die Option
Mapper.eager_defaultswird verwendet. In SQLAlchemy 2.0 wird dieses Verhalten automatisch auf Backends wie PostgreSQL, SQLite und MariaDB angewendet, die RETURNING verwenden, um neue Werte abzurufen, wenn Zeilen eingefügt werden.
Synchrone Methoden und Funktionen unter asyncio ausführen¶
Deep Alchemy
Dieser Ansatz ist im Wesentlichen die öffentliche Freigabe des Mechanismus, durch den SQLAlchemy die asyncio-Schnittstelle überhaupt erst bereitstellen kann. Obwohl es kein technisches Problem damit gibt, kann der Ansatz insgesamt wahrscheinlich als „umstritten“ betrachtet werden, da er gegen einige der zentralen Philosophien des asyncio-Programmiermodells verstößt, nämlich dass jede Programmierungsanweisung, die potenziell E/A hervorrufen kann, einen await-Aufruf haben muss, damit das Programm nicht explizit jede Zeile angibt, in der E/A auftreten kann. Dieser Ansatz ändert diese allgemeine Idee nicht, außer dass er es ermöglicht, eine Reihe von synchronen E/A-Anweisungen vom Regelumfang innerhalb des Gültigkeitsbereichs eines Funktionsaufrufs auszunehmen und sie im Wesentlichen zu einem einzigen awaitable zu bündeln.
Als alternative Methode zur Integration von traditionellem SQLAlchemy „Lazy Loading“ innerhalb einer asyncio-Event-Loop wird eine optionale Methode namens AsyncSession.run_sync() bereitgestellt, die jede Python-Funktion innerhalb eines Greenlets ausführt, wobei traditionelle synchrone Programmierkonzepte in await übersetzt werden, wenn sie den Datenbanktreiber erreichen. Ein hypothetischer Ansatz wäre, dass eine asyncio-orientierte Anwendung datenbankbezogene Methoden in Funktionen verpacken kann, die mit AsyncSession.run_sync() aufgerufen werden.
Wenn wir das obige Beispiel ändern und die selectinload() für die A.bs-Sammlung nicht verwenden, könnten wir die Behandlung dieser Attributzugriffe in einer separaten Funktion durchführen
import asyncio
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
def fetch_and_update_objects(session):
"""run traditional sync-style ORM code in a function that will be
invoked within an awaitable.
"""
# the session object here is a traditional ORM Session.
# all features are available here including legacy Query use.
stmt = select(A)
result = session.execute(stmt)
for a1 in result.scalars():
print(a1)
# lazy loads
for b1 in a1.bs:
print(b1)
# legacy Query use
a1 = session.query(A).order_by(A.id).first()
a1.data = "new data"
async def async_main():
engine = create_async_engine(
"postgresql+asyncpg://scott:tiger@localhost/test",
echo=True,
)
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
async with session.begin():
session.add_all(
[
A(bs=[B(), B()], data="a1"),
A(bs=[B()], data="a2"),
A(bs=[B(), B()], data="a3"),
]
)
await session.run_sync(fetch_and_update_objects)
await session.commit()
# for AsyncEngine created in function scope, close and
# clean-up pooled connections
await engine.dispose()
asyncio.run(async_main())Der obige Ansatz, bestimmte Funktionen in einem „synchronen“ Runner auszuführen, hat einige Parallelen zu einer Anwendung, die eine SQLAlchemy-Anwendung auf einer ereignisbasierten Programmbibliothek wie gevent ausführt. Die Unterschiede sind wie folgt
Im Gegensatz zur Verwendung von
geventkönnen wir weiterhin die Standard-Python-asyncio-Ereignisschleife oder eine beliebige benutzerdefinierte Ereignisschleife verwenden, ohne diegevent-Ereignisschleife integrieren zu müssen.Es gibt keinerlei „Monkeypatching“. Das obige Beispiel verwendet einen echten asyncio-Treiber und der zugrunde liegende SQLAlchemy-Verbindungspool verwendet ebenfalls die integrierte
asyncio.Queuevon Python für das Pooling von Verbindungen.Das Programm kann frei zwischen async/await-Code und enthaltenen Funktionen, die synchronen Code verwenden, wechseln, ohne dass praktisch Leistungseinbußen zu verzeichnen sind. Es wird kein „Thread-Executor“ oder zusätzliche Waiter oder Synchronisation verwendet.
Die zugrunde liegenden Netzwerktreiber verwenden ebenfalls reine Python-asyncio-Konzepte; es werden keine Drittanbieter-Netzwerkbibliotheken wie
geventundeventletverwendet.
Verwendung von Ereignissen mit der asyncio-Erweiterung¶
Das Ereignissystem von SQLAlchemy wird von der asyncio-Erweiterung nicht direkt verfügbar gemacht, was bedeutet, dass es noch keine „asynchrone“ Version eines SQLAlchemy-Ereignisbehandlers gibt.
Da die asyncio-Erweiterung jedoch die übliche synchrone SQLAlchemy-API umschließt, sind reguläre Ereignisbehandler im „synchronen“ Stil frei verfügbar, genau wie wenn asyncio nicht verwendet würde.
Wie unten detailliert beschrieben, gibt es derzeit zwei Strategien, um Ereignisse mit asyncio-orientierten APIs zu registrieren
Ereignisse können auf Instanzebene registriert werden (z. B. eine bestimmte
AsyncEngine-Instanz), indem das Ereignis demsync-Attribut zugeordnet wird, das auf das proxy-objekt verweist. Um beispielsweise dasPoolEvents.connect()-Ereignis für eineAsyncEngine-Instanz zu registrieren, verwenden Sie deren AttributAsyncEngine.sync_engineals Ziel. Zu den Zielen gehörenUm ein Ereignis auf Klassenebene zu registrieren, das sich an alle Instanzen desselben Typs richtet (z. B. alle
AsyncSession-Instanzen), verwenden Sie die entsprechende synchrone Klassenart. Um beispielsweise dasSessionEvents.before_commit()-Ereignis für die KlasseAsyncSessionzu registrieren, verwenden Sie die KlasseSessionals Ziel.Um auf
sessionmaker-Ebene zu registrieren, kombinieren Sie eine explizitesessionmakermit einerasync_sessionmakerunter Verwendung vonasync_sessionmaker.sync_session_classund ordnen Sie Ereignisse dersessionmakerzu.
Wenn Sie innerhalb eines Ereignisbehandlers in einem asyncio-Kontext arbeiten, funktionieren Objekte wie die Connection weiterhin auf ihre übliche „synchrone“ Weise, ohne dass await oder async verwendet werden muss; wenn Nachrichten schließlich vom asyncio-Datenbankadapter empfangen werden, wird der Aufrufstil transparent zurück in den asyncio-Aufrufstil umgewandelt. Für Ereignisse, denen eine Verbindung auf DBAPI-Ebene übergeben wird, wie z. B. PoolEvents.connect(), ist das Objekt ein pep-249-konformes „Verbindungsobjekt“, das synchrone Aufrufe an den asyncio-Treiber anpasst.
Beispiele für Ereignis-Listener mit Async-Engines / Sessions / Sessionmakern¶
Einige Beispiele für synchrone Ereignisbehandler, die mit asyncio-orientierten APIs verbunden sind, werden nachstehend veranschaulicht
Core Events auf AsyncEngine
In diesem Beispiel greifen wir auf das Attribut
AsyncEngine.sync_enginederAsyncEngineals Ziel fürConnectionEventsundPoolEventszuimport asyncio from sqlalchemy import event from sqlalchemy import text from sqlalchemy.engine import Engine from sqlalchemy.ext.asyncio import create_async_engine engine = create_async_engine("postgresql+asyncpg://scott:tiger@localhost:5432/test") # connect event on instance of Engine @event.listens_for(engine.sync_engine, "connect") def my_on_connect(dbapi_con, connection_record): print("New DBAPI connection:", dbapi_con) cursor = dbapi_con.cursor() # sync style API use for adapted DBAPI connection / cursor cursor.execute("select 'execute from event'") print(cursor.fetchone()[0]) # before_execute event on all Engine instances @event.listens_for(Engine, "before_execute") def my_before_execute( conn, clauseelement, multiparams, params, execution_options, ): print("before execute!") async def go(): async with engine.connect() as conn: await conn.execute(text("select 1")) await engine.dispose() asyncio.run(go())
Ausgabe
New DBAPI connection: <AdaptedConnection <asyncpg.connection.Connection object at 0x7f33f9b16960>> execute from event before execute!
ORM Events auf AsyncSession
In diesem Beispiel greifen wir auf
AsyncSession.sync_sessionals Ziel fürSessionEventszuimport asyncio from sqlalchemy import event from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy.orm import Session engine = create_async_engine("postgresql+asyncpg://scott:tiger@localhost:5432/test") session = AsyncSession(engine) # before_commit event on instance of Session @event.listens_for(session.sync_session, "before_commit") def my_before_commit(session): print("before commit!") # sync style API use on Session connection = session.connection() # sync style API use on Connection result = connection.execute(text("select 'execute from event'")) print(result.first()) # after_commit event on all Session instances @event.listens_for(Session, "after_commit") def my_after_commit(session): print("after commit!") async def go(): await session.execute(text("select 1")) await session.commit() await session.close() await engine.dispose() asyncio.run(go())
Ausgabe
before commit! execute from event after commit!
ORM Events auf async_sessionmaker
Für diesen Anwendungsfall erstellen wir eine
sessionmakerals Ereignisziel und weisen sie dann derasync_sessionmakerüber den Parameterasync_sessionmaker.sync_session_classzuimport asyncio from sqlalchemy import event from sqlalchemy.ext.asyncio import async_sessionmaker from sqlalchemy.orm import sessionmaker sync_maker = sessionmaker() maker = async_sessionmaker(sync_session_class=sync_maker) @event.listens_for(sync_maker, "before_commit") def before_commit(session): print("before commit") async def main(): async_session = maker() await async_session.commit() asyncio.run(main())
Ausgabe
before commit
Verwendung von nur awaitable Treibermethoden in Verbindungspool und anderen Ereignissen¶
Wie im obigen Abschnitt erläutert, empfangen Ereignisbehandler, wie z. B. solche, die sich auf die PoolEvents-Ereignisbehandler beziehen, eine synchrone „DBAPI“-Verbindung. Dies ist ein Wrapper-Objekt, das von SQLAlchemy-asyncio-Dialekten bereitgestellt wird, um die zugrunde liegende asyncio-„Treiber“-Verbindung in eine zu integrieren, die von den Interna von SQLAlchemy verwendet werden kann. Ein Sonderfall tritt auf, wenn die vom Benutzer definierte Implementierung für einen solchen Ereignisbehandler direkt auf die ultimative „Treiber“-Verbindung zugreifen muss und dabei nur awaitable Methoden auf dieser Treiberverbindung verwendet.
Um diesen Anwendungsfall zu ermöglichen, stellt die Klasse AdaptedConnection von SQLAlchemy eine Methode AdaptedConnection.run_async() bereit, die es ermöglicht, eine awaitable Funktion im „synchronen“ Kontext eines Ereignisbehandlers oder anderer SQLAlchemy-Interna aufzurufen. Diese Methode ist direkt analog zur Methode AsyncConnection.run_sync(), die es ermöglicht, eine synchrone Methode unter async auszuführen.
AdaptedConnection.run_async() muss eine Funktion übergeben werden, die die innerste „Treiber“-Verbindung als einzelnes Argument akzeptiert und ein Awaitable zurückgibt, das von der Methode AdaptedConnection.run_async() aufgerufen wird. Die Funktion selbst muss nicht als async deklariert werden; es ist vollkommen in Ordnung, wenn es sich um ein Python lambda: handelt, da der zurückgegebene awaitable Wert nach der Rückgabe aufgerufen wird.
from sqlalchemy import event
from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine(...)
@event.listens_for(engine.sync_engine, "connect")
def register_custom_types(dbapi_connection, *args):
dbapi_connection.run_async(
lambda connection: connection.set_type_codec(
"MyCustomType",
encoder,
decoder, # ...
)
)Oben ist das Objekt, das an den register_custom_types-Ereignisbehandler übergeben wird, eine Instanz von AdaptedConnection, die eine DBAPI-ähnliche Schnittstelle zu einem zugrunde liegenden reinen async-Treiber-Verbindungsobjekt bietet. Die Methode AdaptedConnection.run_async() bietet dann Zugriff auf eine awaitable Umgebung, in der auf die zugrunde liegende Treiber-Verbindung zugegriffen werden kann.
Neu ab Version 1.4.30.
Verwendung mehrerer asyncio-Ereignisschleifen¶
Eine Anwendung, die mehrere Ereignisschleifen verwendet, z. B. im seltenen Fall der Kombination von asyncio mit Multithreading, sollte nicht dieselbe AsyncEngine mit verschiedenen Ereignisschleifen teilen, wenn die Standard-Pool-Implementierung verwendet wird.
Wenn eine AsyncEngine von einer Ereignisschleife zur anderen übergeben wird, sollte die Methode AsyncEngine.dispose() aufgerufen werden, bevor sie in einer neuen Ereignisschleife wiederverwendet wird. Andernfalls kann es zu einem RuntimeError kommen, ähnlich wie Task <Task pending ...> got Future attached to a different loop
Wenn dieselbe Engine zwischen verschiedenen Schleifen geteilt werden muss, sollte sie so konfiguriert werden, dass das Pooling mit NullPool deaktiviert wird, was verhindert, dass die Engine eine Verbindung mehr als einmal verwendet.
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.pool import NullPool
engine = create_async_engine(
"postgresql+asyncpg://user:pass@host/dbname",
poolclass=NullPool,
)Verwendung von asynchronen skalierten Sessions¶
Das „scoped session“-Muster, das in threadbasiertem SQLAlchemy mit dem scoped_session-Objekt verwendet wird, ist auch in asyncio verfügbar und verwendet eine angepasste Version namens async_scoped_session.
Tipp
SQLAlchemy empfiehlt im Allgemeinen nicht das „scoped“-Muster für die Neuentwicklung, da es auf veränderbarem globalem Zustand beruht, der auch explizit abgebaut werden muss, wenn die Arbeit innerhalb des Threads oder der Aufgabe abgeschlossen ist. Insbesondere bei der Verwendung von asyncio ist es wahrscheinlich besser, die AsyncSession direkt an die awaitable Funktionen zu übergeben, die sie benötigen.
Bei der Verwendung von async_scoped_session muss, da es im asyncio-Kontext kein „thread-lokales“ Konzept gibt, der Parameter „scopefunc“ dem Konstruktor übergeben werden. Das folgende Beispiel veranschaulicht die Verwendung der Funktion asyncio.current_task() zu diesem Zweck
from asyncio import current_task
from sqlalchemy.ext.asyncio import (
async_scoped_session,
async_sessionmaker,
)
async_session_factory = async_sessionmaker(
some_async_engine,
expire_on_commit=False,
)
AsyncScopedSession = async_scoped_session(
async_session_factory,
scopefunc=current_task,
)
some_async_session = AsyncScopedSession()Warnung
Die von async_scoped_session verwendete „scopefunc“ wird **beliebig oft** innerhalb eines Tasks aufgerufen, einmal für jedes Mal, wenn auf die zugrunde liegende AsyncSession zugegriffen wird. Die Funktion sollte daher **idempotent** und leichtgewichtig sein und nicht versuchen, Zustände zu erstellen oder zu ändern, wie z. B. das Festlegen von Rückrufen usw.
Warnung
Die Verwendung von current_task() für den „Schlüssel“ im Scope erfordert, dass die Methode async_scoped_session.remove() aus dem äußersten awaitable aufgerufen wird, um sicherzustellen, dass der Schlüssel aus dem Registry entfernt wird, wenn der Task abgeschlossen ist. Andernfalls bleiben der Task-Handle sowie die AsyncSession im Speicher, was im Wesentlichen zu einem Speicherleck führt. Siehe das folgende Beispiel, das die korrekte Verwendung von async_scoped_session.remove() veranschaulicht.
async_scoped_session beinhaltet **Proxy-Verhalten**, ähnlich dem von scoped_session, was bedeutet, dass es wie eine AsyncSession direkt behandelt werden kann, wobei zu beachten ist, dass die üblichen await-Schlüsselwörter erforderlich sind, einschließlich der Methode async_scoped_session.remove()
async def some_function(some_async_session, some_object):
# use the AsyncSession directly
some_async_session.add(some_object)
# use the AsyncSession via the context-local proxy
await AsyncScopedSession.commit()
# "remove" the current proxied AsyncSession for the local context
await AsyncScopedSession.remove()Neu in Version 1.4.19.
Verwendung des Inspectors zur Inspektion von Schemaobjekten¶
SQLAlchemy bietet noch keine asyncio-Version des Inspector (eingeführt unter Feingranulare Reflexion mit Inspector), jedoch kann die bestehende Schnittstelle in einem asyncio-Kontext verwendet werden, indem die Methode AsyncConnection.run_sync() der AsyncConnection genutzt wird
import asyncio
from sqlalchemy import inspect
from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine("postgresql+asyncpg://scott:tiger@localhost/test")
def use_inspector(conn):
inspector = inspect(conn)
# use the inspector
print(inspector.get_view_names())
# return any value to the caller
return inspector.get_table_names()
async def async_main():
async with engine.connect() as conn:
tables = await conn.run_sync(use_inspector)
asyncio.run(async_main())Engine API Dokumentation¶
| Objektname | Beschreibung |
|---|---|
async_engine_from_config(configuration[, prefix], **kwargs) |
Erstellt eine neue AsyncEngine-Instanz unter Verwendung eines Konfigurationswörterbuchs. |
Ein asyncio-Proxy für eine |
|
Ein asyncio-Proxy für eine |
|
Ein asyncio-Proxy für eine |
|
create_async_engine(url, **kw) |
Erstellt eine neue asynchrone Engine-Instanz. |
create_async_pool_from_url(url, **kwargs) |
Erstellt eine neue asynchrone Engine-Instanz. |
- function sqlalchemy.ext.asyncio.create_async_engine(url: str | URL, **kw: Any) → AsyncEngine¶
Erstellt eine neue asynchrone Engine-Instanz.
Argumente, die an
create_async_engine()übergeben werden, sind weitgehend identisch mit denen, die an die Funktioncreate_engine()übergeben werden. Die angegebene Dialekt muss ein asyncio-kompatibler Dialekt sein, wie z. B. asyncpg.Neu in Version 1.4.
- Parameter:
async_creator¶ –
ein asynchroner aufrufbarer, der eine treiberseitige asyncio-Verbindung zurückgibt. Wenn angegeben, sollte die Funktion keine Argumente entgegennehmen und eine neue asyncio-Verbindung vom zugrunde liegenden asyncio-Datenbanktreiber zurückgeben; die Verbindung wird in die entsprechenden Strukturen eingepackt, um mit der
AsyncEngineverwendet zu werden. Beachten Sie, dass die in der URL angegebenen Parameter hier nicht angewendet werden und die Creator-Funktion ihre eigenen Verbindungsparameter verwenden sollte.Dieser Parameter ist das asyncio-Äquivalent des Parameters
create_engine.creatorder Funktioncreate_engine().Neu ab Version 2.0.16.
- function sqlalchemy.ext.asyncio.async_engine_from_config(configuration: Dict[str, Any], prefix: str = 'sqlalchemy.', **kwargs: Any) → AsyncEngine¶
Erstellt eine neue AsyncEngine-Instanz unter Verwendung eines Konfigurationswörterbuchs.
Diese Funktion ist analog zur Funktion
engine_from_config()in SQLAlchemy Core, mit der Ausnahme, dass der angeforderte Dialekt ein asyncio-kompatibler Dialekt sein muss, wie z. B. asyncpg. Die Funktionssignatur ist identisch mit der vonengine_from_config().Neu in Version 1.4.29.
- function sqlalchemy.ext.asyncio.create_async_pool_from_url(url: str | URL, **kwargs: Any) → Pool¶
Erstellt eine neue asynchrone Engine-Instanz.
Argumente, die an
create_async_pool_from_url()übergeben werden, sind weitgehend identisch mit denen, die an die Funktioncreate_pool_from_url()übergeben werden. Der angegebene Dialekt muss ein asyncio-kompatibler Dialekt sein, wie z. B. asyncpg.Neu in Version 2.0.10.
- class sqlalchemy.ext.asyncio.AsyncEngine¶
Ein asyncio-Proxy für eine
Engine.AsyncEnginewird über die Funktioncreate_async_engine()bezogen.from sqlalchemy.ext.asyncio import create_async_engine engine = create_async_engine("postgresql+asyncpg://user:pass@host/dbname")
Neu in Version 1.4.
Mitglieder
begin(), clear_compiled_cache(), connect(), dialect, dispose(), driver, echo, engine, execution_options(), get_execution_options(), name, pool, raw_connection(), sync_engine, update_execution_options(), url
Klassensignatur
class
sqlalchemy.ext.asyncio.AsyncEngine(sqlalchemy.ext.asyncio.base.ProxyComparable,sqlalchemy.ext.asyncio.AsyncConnectable)-
method
sqlalchemy.ext.asyncio.AsyncEngine.begin() → AsyncIterator[AsyncConnection]¶ Gibt einen Kontextmanager zurück, der beim Eintreten eine
AsyncConnectionmit einer eingerichtetenAsyncTransactionliefert.Z. B.
async with async_engine.begin() as conn: await conn.execute( text("insert into table (x, y, z) values (1, 2, 3)") ) await conn.execute(text("my_special_procedure(5)"))
-
method
sqlalchemy.ext.asyncio.AsyncEngine.clear_compiled_cache() → None¶ Löscht den kompilierten Cache, der mit dem Dialekt verbunden ist.
Proxied für die Klasse
Engineim Auftrag der KlasseAsyncEngine.Dies betrifft **nur** den integrierten Cache, der über den Parameter
create_engine.query_cache_sizeeingerichtet wird. Er hat keine Auswirkungen auf Wörterbuch-Caches, die über den ParameterConnection.execution_options.compiled_cacheübergeben wurden.Neu in Version 1.4.
-
method
sqlalchemy.ext.asyncio.AsyncEngine.connect() → AsyncConnection¶ Gibt ein
AsyncConnection-Objekt zurück.Die
AsyncConnectionbezieht eine Datenbankverbindung aus dem zugrunde liegenden Connection-Pool, wenn sie als asynchroner Kontextmanager betreten wird.async with async_engine.connect() as conn: result = await conn.execute(select(user_table))
Die
AsyncConnectionkann auch außerhalb eines Kontextmanagers gestartet werden, indem ihre MethodeAsyncConnection.start()aufgerufen wird.
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.dialect¶ Proxy für das Attribut
Engine.dialectim Namen der KlasseAsyncEngine.
-
Methode
sqlalchemy.ext.asyncio.AsyncEngine.async dispose(close: bool = True) → None¶ Gibt den von dieser
AsyncEngineverwendeten Connection-Pool frei.- Parameter:
close¶ –
Wenn der Standardwert
Truebeibehalten wird, werden alle **aktuell eingecheckten** Datenbankverbindungen vollständig geschlossen. Verbindungen, die noch ausgecheckt sind, werden **nicht** geschlossen, aber sie werden nicht mehr mit dieserEngineverknüpft. Wenn sie also einzeln geschlossen werden, wird derPool, mit dem sie verknüpft sind, schließlich von der Garbage Collection erfasst und sie werden vollständig geschlossen, falls sie beim Einchecken nicht bereits geschlossen wurden.Wenn auf
Falsegesetzt, wird der vorherige Connection-Pool dereferenziert und ansonsten in keiner Weise berührt.
Siehe auch
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.driver¶ Treibername des von dieser
EngineverwendetenDialect.Proxied für die Klasse
Engineim Auftrag der KlasseAsyncEngine.
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.echo¶ Wenn
True, wird die Protokollausgabe für dieses Element aktiviert.Proxied für die Klasse
Engineim Auftrag der KlasseAsyncEngine.Dies hat zur Folge, dass die Protokollierungsstufe von Python für den Namensraum der Klasse und Objektinstanz dieses Elements gesetzt wird. Ein boolescher Wert von
Truezeigt an, dass die Protokollierungsstufelogging.INFOfür den Logger gesetzt wird, während der Zeichenfolgenwertdebugdie Protokollierungsstufe auflogging.DEBUGsetzt.
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.engine¶ Gibt diese
Enginezurück.Proxied für die Klasse
Engineim Auftrag der KlasseAsyncEngine.Wird für ältere Schemata verwendet, die
Connection/EngineObjekte innerhalb derselben Variablen akzeptieren.
-
Methode
sqlalchemy.ext.asyncio.AsyncEngine.execution_options(**opt: Any) → AsyncEngine¶ Gibt eine neue
AsyncEnginezurück, dieAsyncConnectionObjekte mit den angegebenen Ausführungsoptionen bereitstellt.Proxied von
Engine.execution_options(). Siehe diese Methode für Details.
-
Methode
sqlalchemy.ext.asyncio.AsyncEngine.get_execution_options() → _ExecuteOptions¶ Ruft die nicht-SQL-Optionen ab, die während der Ausführung wirksam werden.
Proxied für die Klasse
Engineim Auftrag der KlasseAsyncEngine.Siehe auch
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.name¶ Zeichenfolgenname des von dieser
EngineverwendetenDialect.Proxied für die Klasse
Engineim Auftrag der KlasseAsyncEngine.
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.pool¶ Proxy für das Attribut
Engine.poolim Namen der KlasseAsyncEngine.
-
Methode
sqlalchemy.ext.asyncio.AsyncEngine.async raw_connection() → PoolProxiedConnection¶ Gibt eine „rohe“ DBAPI-Verbindung aus dem Connection-Pool zurück.
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.sync_engine: Engine¶ Referenz auf die synchronisierte
Engine, an die dieseAsyncEngineAnfragen weiterleitet.Diese Instanz kann als Ereignisziel verwendet werden.
-
Methode
sqlalchemy.ext.asyncio.AsyncEngine.update_execution_options(**opt: Any) → None¶ Aktualisiert das Standard-Dictionary für Ausführungsoptionen dieser
Engine.Proxied für die Klasse
Engineim Auftrag der KlasseAsyncEngine.Die angegebenen Schlüssel/Werte in **opt werden zu den Standard-Ausführungsoptionen hinzugefügt, die für alle Verbindungen verwendet werden. Der anfängliche Inhalt dieses Dictionaries kann über den Parameter
execution_optionsancreate_engine()übergeben werden.
-
Attribut
sqlalchemy.ext.asyncio.AsyncEngine.url¶ Proxy für das Attribut
Engine.urlim Namen der KlasseAsyncEngine.
-
method
- Klasse sqlalchemy.ext.asyncio.AsyncConnection¶
Ein asyncio-Proxy für eine
Connection.AsyncConnectionwird über die MethodeAsyncEngine.connect()vonAsyncEngineerworben.from sqlalchemy.ext.asyncio import create_async_engine engine = create_async_engine("postgresql+asyncpg://user:pass@host/dbname") async with engine.connect() as conn: result = await conn.execute(select(table))
Neu in Version 1.4.
Mitglieder
aclose(), begin(), begin_nested(), close(), closed, commit(), connection, default_isolation_level, dialect, exec_driver_sql(), execute(), execution_options(), get_nested_transaction(), get_raw_connection(), get_transaction(), in_nested_transaction(), in_transaction(), info, invalidate(), invalidated, rollback(), run_sync(), scalar(), scalars(), start(), stream(), stream_scalars(), sync_connection, sync_engine
Klassensignatur
Klasse
sqlalchemy.ext.asyncio.AsyncConnection(sqlalchemy.ext.asyncio.base.ProxyComparable,sqlalchemy.ext.asyncio.base.StartableContext,sqlalchemy.ext.asyncio.AsyncConnectable)-
Methode
sqlalchemy.ext.asyncio.AsyncConnection.async aclose() → None¶ Ein Synonym für
AsyncConnection.close().Der Name
AsyncConnection.aclose()dient speziell zur Unterstützung der Kontextmanager-Funktion@contextlib.aclosingder Python-Standardbibliothek.Neu in Version 2.0.20.
-
Methode
sqlalchemy.ext.asyncio.AsyncConnection.begin() → AsyncTransaction¶ Beginnt eine Transaktion vor dem automatischen Beginn.
-
Methode
sqlalchemy.ext.asyncio.AsyncConnection.begin_nested() → AsyncTransaction¶ Beginnt eine verschachtelte Transaktion und gibt ein Transaktionshandle zurück.
-
Methode
sqlalchemy.ext.asyncio.AsyncConnection.async close() → None¶ Schließt diese
AsyncConnection.Dies hat zur Folge, dass die Transaktion ebenfalls zurückgerollt wird, falls eine vorhanden ist.
-
Attribut
sqlalchemy.ext.asyncio.AsyncConnection.closed¶ Gibt True zurück, wenn diese Verbindung geschlossen ist.
Proxied für die Klasse
Connectionim Namen der KlasseAsyncConnection.
-
Methode
sqlalchemy.ext.asyncio.AsyncConnection.async commit() → None¶ Commit der gerade laufenden Transaktion.
Diese Methode committet die aktuelle Transaktion, wenn eine gestartet wurde. Wenn keine Transaktion gestartet wurde, hat die Methode keine Auswirkung, vorausgesetzt, die Verbindung ist in einem nicht-invalidierten Zustand.
Eine Transaktion wird automatisch auf einer
Connectiongestartet, sobald ein Statement zum ersten Mal ausgeführt wird, oder wenn die MethodeConnection.begin()aufgerufen wird.
-
Attribut
sqlalchemy.ext.asyncio.AsyncConnection.connection¶ Nicht für asynchron implementiert; rufen Sie
AsyncConnection.get_raw_connection()auf.
-
Attribut
sqlalchemy.ext.asyncio.AsyncConnection.default_isolation_level¶ Die Isolationsstufe beim erstmaligen Verbindungsaufbau, die mit dem von
Dialectin Verwendung ist.Proxied für die Klasse
Connectionim Namen der KlasseAsyncConnection.Dieser Wert ist unabhängig von den Ausführungsoptionen
Connection.execution_options.isolation_levelundEngine.execution_options.isolation_levelund wird von derDialectermittelt, wenn die erste Verbindung erstellt wird, indem eine SQL-Abfrage an die Datenbank für die aktuelle Isolationsstufe durchgeführt wird, bevor weitere Befehle ausgegeben wurden.Das Aufrufen dieses Accessors löst keine neuen SQL-Abfragen aus.
Siehe auch
Connection.get_isolation_level()- Aktuelle tatsächliche Isolationsstufe anzeigencreate_engine.isolation_level- Isolationsstufe proEnginefestlegenConnection.execution_options.isolation_level- Isolationsstufe proConnectionfestlegen
-
Attribut
sqlalchemy.ext.asyncio.AsyncConnection.dialect¶ Proxy für das Attribut
Connection.dialectim Namen der KlasseAsyncConnection.
-
Methode
sqlalchemy.ext.asyncio.AsyncConnection.async exec_driver_sql(statement: str, parameters: _DBAPIAnyExecuteParams | None = None, execution_options: CoreExecuteOptionsParameter | None = None) → CursorResult[Any]¶ Führt eine SQL-Zeichenfolge auf Treiberebene aus und gibt ein gepuffertes
Resultzurück.
-
Methode
sqlalchemy.ext.asyncio.AsyncConnection.async execute(statement: Executable, parameters: _CoreAnyExecuteParams | None = None, *, execution_options: CoreExecuteOptionsParameter | None = None) → CursorResult[Any]¶ Führt ein SQL-Statement-Konstrukt aus und gibt ein gepuffertes
Resultzurück.- Parameter:
object¶ –
Das auszuführende Statement. Dies ist immer ein Objekt, das sowohl zur Hierarchie
ClauseElementals auch zuExecutablegehört, einschließlichDDLund Objekte, die vonExecutableDDLElementerben
parameters¶ – Parameter, die in das Statement gebunden werden. Dies kann entweder ein Dictionary von Parameternamen zu Werten oder eine mutable Sequenz (z. B. eine Liste) von Dictionaries sein. Wenn eine Liste von Dictionaries übergeben wird, wird die zugrunde liegende Statement-Ausführung die DBAPI-Methode
cursor.executemany()verwenden. Wenn ein einzelnes Dictionary übergeben wird, wird die DBAPI-Methodecursor.execute()verwendet.execution_options¶ – optional dictionary of execution options, which will be associated with the statement execution. This dictionary can provide a subset of the options that are accepted by
Connection.execution_options().
- Gibt zurück:
ein
ResultObjekt.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async execution_options(**opt: Any) → AsyncConnection¶ Set non-SQL options for the connection which take effect during execution.
This returns this
AsyncConnectionobject with the new options added.See
Connection.execution_options()for full details on this method.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.get_nested_transaction() → AsyncTransaction | None¶ Return an
AsyncTransactionrepresenting the current nested (savepoint) transaction, if any.This makes use of the underlying synchronous connection’s
Connection.get_nested_transaction()method to get the currentTransaction, which is then proxied in a newAsyncTransactionobject.Neu ab Version 1.4.0b2.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async get_raw_connection() → PoolProxiedConnection¶ Return the pooled DBAPI-level connection in use by this
AsyncConnection.This is a SQLAlchemy connection-pool proxied connection which then has the attribute
_ConnectionFairy.driver_connectionthat refers to the actual driver connection. Its_ConnectionFairy.dbapi_connectionrefers instead to anAdaptedConnectioninstance that adapts the driver connection to the DBAPI protocol.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.get_transaction() → AsyncTransaction | None¶ Return an
AsyncTransactionrepresenting the current transaction, if any.This makes use of the underlying synchronous connection’s
Connection.get_transaction()method to get the currentTransaction, which is then proxied in a newAsyncTransactionobject.Neu ab Version 1.4.0b2.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.in_nested_transaction() → bool¶ Return True if a transaction is in progress.
Neu ab Version 1.4.0b2.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.in_transaction() → bool¶ Return True if a transaction is in progress.
-
attribute
sqlalchemy.ext.asyncio.AsyncConnection.info¶ Return the
Connection.infodictionary of the underlyingConnection.This dictionary is freely writable for user-defined state to be associated with the database connection.
This attribute is only available if the
AsyncConnectionis currently connected. If theAsyncConnection.closedattribute isTrue, then accessing this attribute will raiseResourceClosedError.Neu ab Version 1.4.0b2.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async invalidate(exception: BaseException | None = None) → None¶ Invalidate the underlying DBAPI connection associated with this
Connection.See the method
Connection.invalidate()for full detail on this method.
-
attribute
sqlalchemy.ext.asyncio.AsyncConnection.invalidated¶ Return True if this connection was invalidated.
Proxied für die Klasse
Connectionim Namen der KlasseAsyncConnection.This does not indicate whether or not the connection was invalidated at the pool level, however
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async rollback() → None¶ Roll back the transaction that is currently in progress.
This method rolls back the current transaction if one has been started. If no transaction was started, the method has no effect. If a transaction was started and the connection is in an invalidated state, the transaction is cleared using this method.
Eine Transaktion wird automatisch auf einer
Connectiongestartet, sobald ein Statement zum ersten Mal ausgeführt wird, oder wenn die MethodeConnection.begin()aufgerufen wird.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async run_sync(fn: ~typing.Callable[[~typing.Concatenate[~sqlalchemy.engine.base.Connection, ~_P]], ~sqlalchemy.ext.asyncio.engine._T], *arg: ~typing.~_P, **kw: ~typing.~_P) → _T¶ Invoke the given synchronous (i.e. not async) callable, passing a synchronous-style
Connectionas the first argument.This method allows traditional synchronous SQLAlchemy functions to run within the context of an asyncio application.
Z. B.
def do_something_with_core(conn: Connection, arg1: int, arg2: str) -> str: """A synchronous function that does not require awaiting :param conn: a Core SQLAlchemy Connection, used synchronously :return: an optional return value is supported """ conn.execute(some_table.insert().values(int_col=arg1, str_col=arg2)) return "success" async def do_something_async(async_engine: AsyncEngine) -> None: """an async function that uses awaiting""" async with async_engine.begin() as async_conn: # run do_something_with_core() with a sync-style # Connection, proxied into an awaitable return_code = await async_conn.run_sync( do_something_with_core, 5, "strval" ) print(return_code)
This method maintains the asyncio event loop all the way through to the database connection by running the given callable in a specially instrumented greenlet.
The most rudimentary use of
AsyncConnection.run_sync()is to invoke methods such asMetaData.create_all(), given anAsyncConnectionthat needs to be provided toMetaData.create_all()as aConnectionobject# run metadata.create_all(conn) with a sync-style Connection, # proxied into an awaitable with async_engine.begin() as conn: await conn.run_sync(metadata.create_all)
Hinweis
The provided callable is invoked inline within the asyncio event loop, and will block on traditional IO calls. IO within this callable should only call into SQLAlchemy’s asyncio database APIs which will be properly adapted to the greenlet context.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async scalar(statement: Executable, parameters: _CoreSingleExecuteParams | None = None, *, execution_options: CoreExecuteOptionsParameter | None = None) → Any¶ Executes a SQL statement construct and returns a scalar object.
This method is shorthand for invoking the
Result.scalar()method after invoking theConnection.execute()method. Parameters are equivalent.- Gibt zurück:
a scalar Python value representing the first column of the first row returned.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async scalars(statement: Executable, parameters: _CoreAnyExecuteParams | None = None, *, execution_options: CoreExecuteOptionsParameter | None = None) → ScalarResult[Any]¶ Executes a SQL statement construct and returns a scalar objects.
This method is shorthand for invoking the
Result.scalars()method after invoking theConnection.execute()method. Parameters are equivalent.- Gibt zurück:
ein
ScalarResultObjekt.
Neu in Version 1.4.24.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async start(is_ctxmanager: bool = False) → AsyncConnection¶ Start this
AsyncConnectionobject’s context outside of using a Pythonwith:block.
-
method
sqlalchemy.ext.asyncio.AsyncConnection.stream(statement: Executable, parameters: _CoreAnyExecuteParams | None = None, *, execution_options: CoreExecuteOptionsParameter | None = None) → AsyncIterator[AsyncResult[Any]]¶ Execute a statement and return an awaitable yielding a
AsyncResultobject.Z. B.
result = await conn.stream(stmt) async for row in result: print(f"{row}")
The
AsyncConnection.stream()method supports optional context manager use against theAsyncResultobject, as inasync with conn.stream(stmt) as result: async for row in result: print(f"{row}")
In the above pattern, the
AsyncResult.close()method is invoked unconditionally, even if the iterator is interrupted by an exception throw. Context manager use remains optional, however, and the function may be called in either anasync with fn():orawait fn()style.New in version 2.0.0b3: added context manager support
- Gibt zurück:
an awaitable object that will yield an
AsyncResultobject.
Siehe auch
-
method
sqlalchemy.ext.asyncio.AsyncConnection.async stream_scalars(statement: Executable, parameters: _CoreSingleExecuteParams | None = None, *, execution_options: CoreExecuteOptionsParameter | None = None) → AsyncIterator[AsyncScalarResult[Any]]¶ Execute a statement and return an awaitable yielding a
AsyncScalarResultobject.Z. B.
result = await conn.stream_scalars(stmt) async for scalar in result: print(f"{scalar}")
This method is shorthand for invoking the
AsyncResult.scalars()method after invoking theConnection.stream()method. Parameters are equivalent.The
AsyncConnection.stream_scalars()method supports optional context manager use against theAsyncScalarResultobject, as inasync with conn.stream_scalars(stmt) as result: async for scalar in result: print(f"{scalar}")
In the above pattern, the
AsyncScalarResult.close()method is invoked unconditionally, even if the iterator is interrupted by an exception throw. Context manager use remains optional, however, and the function may be called in either anasync with fn():orawait fn()style.New in version 2.0.0b3: added context manager support
- Gibt zurück:
an awaitable object that will yield an
AsyncScalarResultobject.
Neu in Version 1.4.24.
Siehe auch
-
attribute
sqlalchemy.ext.asyncio.AsyncConnection.sync_connection: Connection | None¶ Reference to the sync-style
ConnectionthisAsyncConnectionproxies requests towards.Diese Instanz kann als Ereignisziel verwendet werden.
-
attribute
sqlalchemy.ext.asyncio.AsyncConnection.sync_engine: Engine¶ Reference to the sync-style
EnginethisAsyncConnectionis associated with via its underlyingConnection.Diese Instanz kann als Ereignisziel verwendet werden.
-
Methode
- Klasse sqlalchemy.ext.asyncio.AsyncTransaction¶
Ein asyncio-Proxy für eine
Transaction.Mitglieder
Klassensignatur
class
sqlalchemy.ext.asyncio.AsyncTransaction(sqlalchemy.ext.asyncio.base.ProxyComparable,sqlalchemy.ext.asyncio.base.StartableContext)-
Methode
sqlalchemy.ext.asyncio.AsyncTransaction.async close() → None¶ Schließt diese
AsyncTransaction.Wenn diese Transaktion die Basis-Transaktion in einer verschachtelten Begin/Commit-Struktur ist, wird die Transaktion zurückgerollt(). Andernfalls kehrt die Methode zurück.
Dies wird verwendet, um eine Transaktion abzubrechen, ohne den Geltungsbereich einer umschließenden Transaktion zu beeinflussen.
-
Methode
sqlalchemy.ext.asyncio.AsyncTransaction.async commit() → None¶ Commit dieser
AsyncTransaction.
-
Methode
sqlalchemy.ext.asyncio.AsyncTransaction.async rollback() → None¶ Rollback dieser
AsyncTransaction.
-
Methode
sqlalchemy.ext.asyncio.AsyncTransaction.async start(is_ctxmanager: bool = False) → AsyncTransaction¶ Startet den Kontext dieses
AsyncTransaction-Objekts außerhalb der Verwendung eines Pythonwith:-Blocks.
-
Methode
Dokumentation der Result Set API¶
Das Objekt AsyncResult ist eine asynchrone Anpassung des Objekts Result. Es wird nur zurückgegeben, wenn die Methoden AsyncConnection.stream() oder AsyncSession.stream() verwendet werden, die ein Ergebnisobjekt zurückgeben, das auf einem aktiven Datenbank-Cursor liegt.
| Objektname | Beschreibung |
|---|---|
Ein Wrapper für ein |
|
Ein asyncio-Wrapper um ein |
|
Ein Wrapper für ein |
|
Ein |
- Klasse sqlalchemy.ext.asyncio.AsyncResult¶
Ein asyncio-Wrapper um ein
Result-Objekt.Die
AsyncResultgilt nur für Ausführungen von Anweisungen, die einen serverseitigen Cursor verwenden. Sie wird nur von den MethodenAsyncConnection.stream()undAsyncSession.stream()zurückgegeben.Hinweis
Wie bei
Resultwird dieses Objekt für ORM-Ergebnisse verwendet, die vonAsyncSession.execute()zurückgegeben werden. Dies kann Instanzen von ORM-abgebildeten Objekten entweder einzeln oder innerhalb von Tupel-ähnlichen Zeilen ergeben. Beachten Sie, dass diese Ergebnisobjekte Instanzen oder Zeilen nicht automatisch deduplizieren, wie es beim altenQuery-Objekt der Fall ist. Für die Deduplizierung von Instanzen oder Zeilen in Python verwenden Sie die Modifier-MethodeAsyncResult.unique().Neu in Version 1.4.
Mitglieder
all(), close(), closed, columns(), fetchall(), fetchmany(), fetchone(), first(), freeze(), keys(), mappings(), one(), one_or_none(), partitions(), scalar(), scalar_one(), scalar_one_or_none(), scalars(), t, tuples(), unique(), yield_per()
Klassensignatur
class
sqlalchemy.ext.asyncio.AsyncResult(sqlalchemy.engine._WithKeys,sqlalchemy.ext.asyncio.AsyncCommon)-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async all() → Sequence[Row[_TP]]¶ Gibt alle Zeilen in einer Liste zurück.
Schließt das Ergebnis nach der Ausführung. Nachfolgende Aufrufe geben eine leere Liste zurück.
- Gibt zurück:
eine Liste von
Row-Objekten.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async close() → None¶ geerbt von der
AsyncCommon.close()Methode vonAsyncCommonSchließt dieses Ergebnis.
-
Attribut
sqlalchemy.ext.asyncio.AsyncResult.closed¶ geerbt von der
AsyncCommon.closedAttribut vonAsyncCommonProxies das .closed Attribut des zugrunde liegenden Ergebnisobjekts, falls vorhanden, andernfalls wird
AttributeErrorausgelöst.Neu ab Version 2.0.0b3.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.columns(*col_expressions: _KeyIndexType) → Self¶ Legt die Spalten fest, die in jeder Zeile zurückgegeben werden sollen.
Siehe
Result.columns()in der synchronen SQLAlchemy-API für eine vollständige Verhaltensbeschreibung.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async fetchall() → Sequence[Row[_TP]]¶ Ein Synonym für die Methode
AsyncResult.all().Neu in Version 2.0.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async fetchmany(size: int | None = None) → Sequence[Row[_TP]]¶ Holt viele Zeilen.
Wenn alle Zeilen erschöpft sind, wird eine leere Liste zurückgegeben.
Diese Methode wird zur Rückwärtskompatibilität mit SQLAlchemy 1.x.x bereitgestellt.
Um Zeilen in Gruppen abzurufen, verwenden Sie die Methode
AsyncResult.partitions().- Gibt zurück:
eine Liste von
Row-Objekten.
Siehe auch
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async fetchone() → Row[_TP] | None¶ Holt eine Zeile.
Wenn alle Zeilen erschöpft sind, wird None zurückgegeben.
Diese Methode wird zur Rückwärtskompatibilität mit SQLAlchemy 1.x.x bereitgestellt.
Um die erste Zeile eines Ergebnisses abzurufen, verwenden Sie die Methode
AsyncResult.first(). Um alle Zeilen zu durchlaufen, iterieren Sie direkt über das ObjektAsyncResult.- Gibt zurück:
ein
Row-Objekt, wenn keine Filter angewendet werden, oderNone, wenn keine Zeilen mehr vorhanden sind.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async first() → Row[_TP] | None¶ Gibt die erste Zeile zurück oder
None, wenn keine Zeile vorhanden ist.Schließt das Ergebnis und verwirft verbleibende Zeilen.
Hinweis
Diese Methode gibt standardmäßig eine **Zeile** zurück, z. B. ein Tupel. Um genau einen einzelnen Skalarwert zurückzugeben, d. h. die erste Spalte der ersten Zeile, verwenden Sie die Methode
AsyncResult.scalar()oder kombinieren SieAsyncResult.scalars()undAsyncResult.first().Zusätzlich, im Gegensatz zum Verhalten der veralteten ORM-Methode
Query.first(), wird **kein Limit** auf die SQL-Abfrage angewendet, die zur Erzeugung diesesAsyncResultaufgerufen wurde; für einen DBAPI-Treiber, der Ergebnisse im Speicher puffert, bevor Zeilen zurückgegeben werden, werden alle Zeilen an den Python-Prozess gesendet und alle bis auf die erste Zeile verworfen.Siehe auch
- Gibt zurück:
ein
Row-Objekt oder None, wenn keine Zeilen mehr vorhanden sind.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async freeze() → FrozenResult[_TP]¶ Gibt ein aufrufbares Objekt zurück, das Kopien dieses
AsyncResulterzeugt, wenn es aufgerufen wird.Das zurückgegebene aufrufbare Objekt ist eine Instanz von
FrozenResult.Dies wird für das Caching von Ergebnissets verwendet. Die Methode muss für das Ergebnis aufgerufen werden, wenn es unverbraucht ist, und das Aufrufen der Methode verbraucht das Ergebnis vollständig. Wenn das
FrozenResultaus einem Cache abgerufen wird, kann es beliebig oft aufgerufen werden, wobei jedes Mal ein neuesResult-Objekt gegen seinen gespeicherten Zeilensatz erzeugt wird.Siehe auch
Wiederholte Ausführung von Anweisungen - Beispielverwendung innerhalb des ORM zur Implementierung eines Ergebnisset-Caches.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.keys() → RMKeyView¶ geerbt von der
sqlalchemy.engine._WithKeys.keysMethode vonsqlalchemy.engine._WithKeysGibt eine iterierbare Ansicht zurück, die die Zeichenketkenschlüssel liefert, die jede
Rowrepräsentieren würde.Die Schlüssel können die Labels der Spalten darstellen, die von einer Core-Anweisung zurückgegeben werden, oder die Namen der ORM-Klassen, die von einer ORM-Ausführung zurückgegeben werden.
Die Ansicht kann auch mit dem Python-Operator
inauf Schlüsselcontainment getestet werden, der sowohl auf die Zeichenketkenschlüssel in der Ansicht als auch auf alternative Schlüssel wie Spaltenobjekte testet.Geändert in Version 1.4: ein Key-View-Objekt wird zurückgegeben anstelle einer einfachen Liste.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.mappings() → AsyncMappingResult¶ Wendet einen Mappings-Filter auf die zurückgegebenen Zeilen an und gibt eine Instanz von
AsyncMappingResultzurück.Wenn dieser Filter angewendet wird, gibt das Abrufen von Zeilen
RowMapping-Objekte anstelle vonRow-Objekten zurück.- Gibt zurück:
ein neues
AsyncMappingResult-Filterobjekt, das auf das zugrunde liegendeResult-Objekt verweist.
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async one() → Row[_TP]¶ Gibt genau eine Zeile zurück oder löst eine Ausnahme aus.
Löst
NoResultFoundaus, wenn das Ergebnis keine Zeilen zurückgibt, oderMultipleResultsFound, wenn mehrere Zeilen zurückgegeben würden.Hinweis
Diese Methode gibt standardmäßig eine **Zeile** zurück, z. B. ein Tupel. Um genau einen einzelnen Skalarwert zurückzugeben, d. h. die erste Spalte der ersten Zeile, verwenden Sie die Methode
AsyncResult.scalar_one()oder kombinieren SieAsyncResult.scalars()undAsyncResult.one().Neu in Version 1.4.
- Gibt zurück:
Die erste
Row.- Löst aus:
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async one_or_none() → Row[_TP] | None¶ Gibt maximal ein Ergebnis zurück oder löst eine Ausnahme aus.
Gibt
Nonezurück, wenn das Ergebnis keine Zeilen hat. LöstMultipleResultsFoundaus, wenn mehrere Zeilen zurückgegeben werden.Neu in Version 1.4.
- Gibt zurück:
Die erste
RowoderNone, wenn keine Zeile verfügbar ist.- Löst aus:
-
Methode
sqlalchemy.ext.asyncio.AsyncResult.async partitions(size: int | None = None) → AsyncIterator[Sequence[Row[_TP]]]¶ Iteriert durch Unterlisten von Zeilen der angegebenen Größe.
Ein asynchroner Iterator wird zurückgegeben
async def scroll_results(connection): result = await connection.stream(select(users_table)) async for partition in result.partitions(100): print("list of rows: %s" % partition)
Siehe
Result.partitions()in der synchronen SQLAlchemy-API für eine vollständige Verhaltensbeschreibung.
-
method
sqlalchemy.ext.asyncio.AsyncResult.async scalar() → Any¶ Holt die erste Spalte der ersten Zeile und schließt den Ergebnissatz.
Gibt
Nonezurück, wenn keine Zeilen zum Abrufen vorhanden sind.Es wird keine Validierung durchgeführt, um zu prüfen, ob zusätzliche Zeilen verbleiben.
Nach dem Aufruf dieser Methode ist das Objekt vollständig geschlossen, z. B. wurde die Methode
CursorResult.close()aufgerufen.- Gibt zurück:
ein Python-Skalarwert oder
None, wenn keine Zeilen verbleiben.
-
method
sqlalchemy.ext.asyncio.AsyncResult.async scalar_one() → Any¶ Gibt genau ein Skalarergebnis zurück oder löst eine Ausnahme aus.
Dies entspricht dem Aufruf von
AsyncResult.scalars()und dannAsyncScalarResult.one().
-
method
sqlalchemy.ext.asyncio.AsyncResult.async scalar_one_or_none() → Any | None¶ Gibt genau ein Skalarergebnis oder
Nonezurück.Dies entspricht dem Aufruf von
AsyncResult.scalars()und dannAsyncScalarResult.one_or_none().
-
method
sqlalchemy.ext.asyncio.AsyncResult.scalars(index: _KeyIndexType = 0) → AsyncScalarResult[Any]¶ Gibt ein
AsyncScalarResult-Filterobjekt zurück, das einzelne Elemente anstelle vonRow-Objekten zurückgibt.Siehe
Result.scalars()in der synchronen SQLAlchemy-API für eine vollständige Verhaltensbeschreibung.- Parameter:
index¶ – Ganzzahl oder Zeilenschlüssel, der die aus jeder Zeile abzurufende Spalte angibt, standardmäßig
0für die erste Spalte.- Gibt zurück:
ein neues
AsyncScalarResult-Filterobjekt, das auf diesesAsyncResult-Objekt verweist.
-
attribute
sqlalchemy.ext.asyncio.AsyncResult.t¶ Wendet einen "typed tuple" Typisierungsfilter auf die zurückgegebenen Zeilen an.
Das Attribut
AsyncResult.tist ein Synonym für den Aufruf der MethodeAsyncResult.tuples().Neu in Version 2.0.
-
method
sqlalchemy.ext.asyncio.AsyncResult.tuples() → AsyncTupleResult[_TP]¶ Wendet einen "typed tuple" Typisierungsfilter auf die zurückgegebenen Zeilen an.
Diese Methode gibt zur Laufzeit dasselbe
AsyncResult-Objekt zurück, annotiert jedoch als Rückgabe einesAsyncTupleResult-Objekts, das für PEP 484-Typisierungswerkzeuge angibt, dass einfache typisierteTuple-Instanzen anstelle von Zeilen zurückgegeben werden. Dies ermöglicht Tupel-Entpackung und__getitem__-Zugriff aufRow-Objekte, für Fälle, in denen die aufgerufene Anweisung selbst Typinformationen enthielt.Neu in Version 2.0.
- Gibt zurück:
der Typ
AsyncTupleResultzur Typisierungszeit.
-
method
sqlalchemy.ext.asyncio.AsyncResult.unique(strategy: _UniqueFilterType | None = None) → Self¶ Eindeutige Filterung auf die von diesem
AsyncResultzurückgegebenen Objekte anwenden.Siehe
Result.unique()in der synchronen SQLAlchemy-API für eine vollständige Verhaltensbeschreibung.
-
method
sqlalchemy.ext.asyncio.AsyncResult.yield_per(num: int) → Self¶ geerbt von der
FilterResult.yield_per()Methode vonFilterResultKonfiguriert die Strategie zum Abrufen von Zeilen so, dass
numZeilen auf einmal abgerufen werden.Die Methode
FilterResult.yield_per()ist eine Weiterleitung an die MethodeResult.yield_per(). Siehe die Dokumentation dieser Methode für Nutzungshinweise.Neu in Version 1.4.40: - hinzugefügt
FilterResult.yield_per(), damit die Methode für alle Ergebnissatzimplementierungen verfügbar istSiehe auch
Serverseitige Cursor verwenden (auch bekannt als Streaming-Ergebnisse) - beschreibt das Kernverhalten für
Result.yield_per()Abrufen großer Ergebnissätze mit Yield Per - im ORM Querying Guide
-
Methode
- class sqlalchemy.ext.asyncio.AsyncScalarResult¶
Ein Wrapper für ein
AsyncResult, das Skalarwerte anstelle vonRow-Werten zurückgibt.Das Objekt
AsyncScalarResultwird durch Aufrufen der MethodeAsyncResult.scalars()erhalten.Siehe das Objekt
ScalarResultin der synchronen SQLAlchemy-API für eine vollständige Verhaltensbeschreibung.Neu in Version 1.4.
Mitglieder
all(), close(), closed, fetchall(), fetchmany(), first(), one(), one_or_none(), partitions(), unique(), yield_per()
Klassensignatur
class
sqlalchemy.ext.asyncio.AsyncScalarResult(sqlalchemy.ext.asyncio.AsyncCommon)-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async all() → Sequence[_R]¶ Gibt alle Skalarwerte als Liste zurück.
Äquivalent zu
AsyncResult.all(), außer dass Skalarwerte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async close() → None¶ geerbt von der
AsyncCommon.close()Methode vonAsyncCommonSchließt dieses Ergebnis.
-
attribute
sqlalchemy.ext.asyncio.AsyncScalarResult.closed¶ geerbt von der
AsyncCommon.closedAttribut vonAsyncCommonProxies das .closed Attribut des zugrunde liegenden Ergebnisobjekts, falls vorhanden, andernfalls wird
AttributeErrorausgelöst.Neu ab Version 2.0.0b3.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async fetchall() → Sequence[_R]¶ Ein Synonym für die Methode
AsyncScalarResult.all().
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async fetchmany(size: int | None = None) → Sequence[_R]¶ Ruft viele Objekte ab.
Äquivalent zu
AsyncResult.fetchmany(), außer dass Skalarwerte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async first() → _R | None¶ Ruft das erste Objekt ab oder
None, wenn kein Objekt vorhanden ist.Äquivalent zu
AsyncResult.first(), außer dass Skalarwerte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async one() → _R¶ Gibt genau ein Objekt zurück oder löst eine Ausnahme aus.
Äquivalent zu
AsyncResult.one(), außer dass Skalarwerte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async one_or_none() → _R | None¶ Gibt höchstens ein Objekt zurück oder löst eine Ausnahme aus.
Äquivalent zu
AsyncResult.one_or_none(), außer dass Skalarwerte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.async partitions(size: int | None = None) → AsyncIterator[Sequence[_R]]¶ Iteriert durch Unterlisten von Elementen der angegebenen Größe.
Äquivalent zu
AsyncResult.partitions(), außer dass Skalarwerte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.unique(strategy: _UniqueFilterType | None = None) → Self¶ Eindeutige Filterung auf die von diesem
AsyncScalarResultzurückgegebenen Objekte anwenden.Siehe
AsyncResult.unique()für Details zur Verwendung.
-
method
sqlalchemy.ext.asyncio.AsyncScalarResult.yield_per(num: int) → Self¶ geerbt von der
FilterResult.yield_per()Methode vonFilterResultKonfiguriert die Strategie zum Abrufen von Zeilen so, dass
numZeilen auf einmal abgerufen werden.Die Methode
FilterResult.yield_per()ist eine Weiterleitung an die MethodeResult.yield_per(). Siehe die Dokumentation dieser Methode für Nutzungshinweise.Neu in Version 1.4.40: - hinzugefügt
FilterResult.yield_per(), damit die Methode für alle Ergebnissatzimplementierungen verfügbar istSiehe auch
Serverseitige Cursor verwenden (auch bekannt als Streaming-Ergebnisse) - beschreibt das Kernverhalten für
Result.yield_per()Abrufen großer Ergebnissätze mit Yield Per - im ORM Querying Guide
-
method
- class sqlalchemy.ext.asyncio.AsyncMappingResult¶
Ein Wrapper für ein
AsyncResult, das Wörterbuchwerte anstelle vonRow-Werten zurückgibt.Das Objekt
AsyncMappingResultwird durch Aufrufen der MethodeAsyncResult.mappings()erhalten.Siehe das Objekt
MappingResultin der synchronen SQLAlchemy-API für eine vollständige Verhaltensbeschreibung.Neu in Version 1.4.
Mitglieder
all(), close(), closed, columns(), fetchall(), fetchmany(), fetchone(), first(), keys(), one(), one_or_none(), partitions(), unique(), yield_per()
Klassensignatur
class
sqlalchemy.ext.asyncio.AsyncMappingResult(sqlalchemy.engine._WithKeys,sqlalchemy.ext.asyncio.AsyncCommon)-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async all() → Sequence[RowMapping]¶ Gibt alle Zeilen in einer Liste zurück.
Äquivalent zu
AsyncResult.all(), außer dassRowMapping-Werte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async close() → None¶ geerbt von der
AsyncCommon.close()Methode vonAsyncCommonSchließt dieses Ergebnis.
-
attribute
sqlalchemy.ext.asyncio.AsyncMappingResult.closed¶ geerbt von der
AsyncCommon.closedAttribut vonAsyncCommonProxies das .closed Attribut des zugrunde liegenden Ergebnisobjekts, falls vorhanden, andernfalls wird
AttributeErrorausgelöst.Neu ab Version 2.0.0b3.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.columns(*col_expressions: _KeyIndexType) → Self¶ Legt die Spalten fest, die in jeder Zeile zurückgegeben werden sollen.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async fetchall() → Sequence[RowMapping]¶ Ein Synonym für die Methode
AsyncMappingResult.all().
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async fetchmany(size: int | None = None) → Sequence[RowMapping]¶ Holt viele Zeilen.
Äquivalent zu
AsyncResult.fetchmany(), außer dassRowMapping-Werte anstelle vonRow-Objekten zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async fetchone() → RowMapping | None¶ Ruft ein Objekt ab.
Entspricht
AsyncResult.fetchone(), mit dem Unterschied, dass stattRow-ObjektenRowMapping-Werte zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async first() → RowMapping | None¶ Ruft das erste Objekt ab oder
None, wenn kein Objekt vorhanden ist.Entspricht
AsyncResult.first(), mit dem Unterschied, dass stattRow-ObjektenRowMapping-Werte zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.keys() → RMKeyView¶ geerbt von der
sqlalchemy.engine._WithKeys.keysMethode vonsqlalchemy.engine._WithKeysGibt eine iterierbare Ansicht zurück, die die Zeichenketkenschlüssel liefert, die jede
Rowrepräsentieren würde.Die Schlüssel können die Labels der Spalten darstellen, die von einer Core-Anweisung zurückgegeben werden, oder die Namen der ORM-Klassen, die von einer ORM-Ausführung zurückgegeben werden.
Die Ansicht kann auch mit dem Python-Operator
inauf Schlüsselcontainment getestet werden, der sowohl auf die Zeichenketkenschlüssel in der Ansicht als auch auf alternative Schlüssel wie Spaltenobjekte testet.Geändert in Version 1.4: ein Key-View-Objekt wird zurückgegeben anstelle einer einfachen Liste.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async one() → RowMapping¶ Gibt genau ein Objekt zurück oder löst eine Ausnahme aus.
Entspricht
AsyncResult.one(), mit dem Unterschied, dass stattRow-ObjektenRowMapping-Werte zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async one_or_none() → RowMapping | None¶ Gibt höchstens ein Objekt zurück oder löst eine Ausnahme aus.
Entspricht
AsyncResult.one_or_none(), mit dem Unterschied, dass stattRow-ObjektenRowMapping-Werte zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.async partitions(size: int | None = None) → AsyncIterator[Sequence[RowMapping]]¶ Iteriert durch Unterlisten von Elementen der angegebenen Größe.
Entspricht
AsyncResult.partitions(), mit dem Unterschied, dass stattRow-ObjektenRowMapping-Werte zurückgegeben werden.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.unique(strategy: _UniqueFilterType | None = None) → Self¶ Wendet eindeutige Filterung auf die von diesem
AsyncMappingResultzurückgegebenen Objekte an.Siehe
AsyncResult.unique()für Details zur Verwendung.
-
method
sqlalchemy.ext.asyncio.AsyncMappingResult.yield_per(num: int) → Self¶ geerbt von der
FilterResult.yield_per()Methode vonFilterResultKonfiguriert die Strategie zum Abrufen von Zeilen so, dass
numZeilen auf einmal abgerufen werden.Die Methode
FilterResult.yield_per()ist eine Weiterleitung an die MethodeResult.yield_per(). Siehe die Dokumentation dieser Methode für Nutzungshinweise.Neu in Version 1.4.40: - hinzugefügt
FilterResult.yield_per(), damit die Methode für alle Ergebnissatzimplementierungen verfügbar istSiehe auch
Serverseitige Cursor verwenden (auch bekannt als Streaming-Ergebnisse) - beschreibt das Kernverhalten für
Result.yield_per()Abrufen großer Ergebnissätze mit Yield Per - im ORM Querying Guide
-
method
- class sqlalchemy.ext.asyncio.AsyncTupleResult¶
Ein
AsyncResult, das so typisiert ist, dass es anstelle von Zeilen normale Python-Tupel zurückgibt.Da
Rowsich in jeder Hinsicht bereits wie ein Tupel verhält, ist diese Klasse eine reine Typisierungsklasse;AsyncResultwird zur Laufzeit weiterhin verwendet.Klassensignatur
class
sqlalchemy.ext.asyncio.AsyncTupleResult(sqlalchemy.ext.asyncio.AsyncCommon,sqlalchemy.util.langhelpers.TypingOnly)
ORM Session API Dokumentation¶
| Objektname | Beschreibung |
|---|---|
async_object_session(instance) |
Gibt die |
Bietet verwaltete Handhabung von |
|
async_session(session) |
Gibt die |
Eine konfigurierbare |
|
Mixin-Klasse, die einen awaitable Zugriff auf alle Attribute bereitstellt. |
|
Asyncio-Version von |
|
Ein Wrapper für das ORM |
|
Schließt alle |
- function sqlalchemy.ext.asyncio.async_object_session(instance: object) → AsyncSession | None¶
Gibt die
AsyncSessionzurück, zu der die gegebene Instanz gehört.Diese Funktion verwendet die Sync-API-Funktion
object_session, um dieSessionabzurufen, die auf die gegebene Instanz verweist, und von dort aus wird sie mit der ursprünglichenAsyncSessionverknüpft.Wenn die
AsyncSessionvom Garbage Collector bereinigt wurde, ist der RückgabewertNone.Diese Funktionalität ist auch über den
InstanceState.async_session-Accessor verfügbar.- Parameter:
instance¶ – eine ORM-gemappte Instanz
- Gibt zurück:
ein
AsyncSession-Objekt oderNone.
Neu in Version 1.4.18.
- function sqlalchemy.ext.asyncio.async_session(session: Session) → AsyncSession | None¶
Gibt die
AsyncSessionzurück, die das gegebeneSession-Objekt proxyt, falls vorhanden.- Parameter:
- Gibt zurück:
eine
AsyncSession-Instanz oderNone.
Neu in Version 1.4.18.
- function async sqlalchemy.ext.asyncio.close_all_sessions() → None¶
Schließt alle
AsyncSession-Sessions.Neu in Version 2.0.23.
Siehe auch
close_all_sessions()
- class sqlalchemy.ext.asyncio.async_sessionmaker¶
Eine konfigurierbare
AsyncSession-Factory.Die
async_sessionmaker-Factory funktioniert genauso wie diesessionmaker-Factory, um neueAsyncSession-Objekte zu generieren, wenn sie aufgerufen wird, und erstellt diese unter Berücksichtigung der hier festgelegten Konfigurationsargumente.z. B.
from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import async_sessionmaker async def run_some_sql( async_session: async_sessionmaker[AsyncSession], ) -> None: async with async_session() as session: session.add(SomeObject(data="object")) session.add(SomeOtherObject(name="other object")) await session.commit() async def main() -> None: # an AsyncEngine, which the AsyncSession will use for connection # resources engine = create_async_engine( "postgresql+asyncpg://scott:tiger@localhost/" ) # create a reusable factory for new AsyncSession instances async_session = async_sessionmaker(engine) await run_some_sql(async_session) await engine.dispose()
Die
async_sessionmakerist nützlich, damit verschiedene Teile eines Programms neueAsyncSession-Objekte mit einer vorab festgelegten Konfiguration erstellen können. Beachten Sie, dassAsyncSession-Objekte auch direkt instanziiert werden können, wennasync_sessionmakernicht verwendet wird.Neu in Version 2.0:
async_sessionmakerstellt einesessionmaker-Klasse bereit, die speziell für dasAsyncSession-Objekt ist, einschließlich PEP-484-Typunterstützung.Siehe auch
Zusammenfassung - ORM - zeigt Beispielnutzung
sessionmaker- allgemeiner Überblick über diesessionmakerArchitektur
Öffnen und Schließen einer Session - einleitender Text zur Erstellung von Sessions mit
sessionmaker.Mitglieder
Klassensignatur
class
sqlalchemy.ext.asyncio.async_sessionmaker(typing.Generic)-
method
sqlalchemy.ext.asyncio.async_sessionmaker.__call__(**local_kw: Any) → _AS¶ Erzeugt ein neues
AsyncSession-Objekt unter Verwendung der in dieserasync_sessionmakerfestgelegten Konfiguration.In Python wird die Methode
__call__aufgerufen, wenn ein Objekt wie eine Funktion „aufgerufen“ wird.AsyncSession = async_sessionmaker(async_engine, expire_on_commit=False) session = AsyncSession() # invokes sessionmaker.__call__()
-
method
sqlalchemy.ext.asyncio.async_sessionmaker.__init__(bind: Optional[_AsyncSessionBind] = None, *, class_: Type[_AS] = <class 'sqlalchemy.ext.asyncio.session.AsyncSession'>, autoflush: bool = True, expire_on_commit: bool = True, info: Optional[_InfoType] = None, **kw: Any)¶ Erstellt einen neuen
async_sessionmaker.Alle hier aufgeführten Argumente mit Ausnahme von
class_entsprechen Argumenten, die vonSessiondirekt akzeptiert werden. Weitere Details zu den Parametern finden Sie in der Dokumentation zuAsyncSession.__init__().
-
method
sqlalchemy.ext.asyncio.async_sessionmaker.begin() → _AsyncSessionContextManager[_AS]¶ Erzeugt einen Kontextmanager, der sowohl eine neue
AsyncSessionals auch eine Transaktion bereitstellt, die committet wird.z. B.
async def main(): Session = async_sessionmaker(some_engine) async with Session.begin() as session: session.add(some_object) # commits transaction, closes session
-
method
sqlalchemy.ext.asyncio.async_sessionmaker.configure(**new_kw: Any) → None¶ Konfiguriert die Argumente für diese async_sessionmaker (neu) (neu).
z. B.
AsyncSession = async_sessionmaker(some_engine) AsyncSession.configure(bind=create_async_engine("sqlite+aiosqlite://"))
- class sqlalchemy.ext.asyncio.async_scoped_session¶
Bietet verwaltete Handhabung von
AsyncSession-Objekten.Details zur Verwendung finden Sie im Abschnitt Verwendung von asyncio scoped session.
Neu in Version 1.4.19.
Mitglieder
__call__(), __init__(), aclose(), add(), add_all(), autoflush, begin(), begin_nested(), bind, close(), close_all(), commit(), configure(), connection(), delete(), deleted, dirty, execute(), expire(), expire_all(), expunge(), expunge_all(), flush(), get(), get_bind(), get_one(), identity_key(), identity_map, info, invalidate(), is_active, is_modified(), merge(), new, no_autoflush, object_session(), refresh(), remove(), reset(), rollback(), scalar(), scalars(), session_factory, stream(), stream_scalars()
Klassensignatur
class
sqlalchemy.ext.asyncio.async_scoped_session(typing.Generic)-
method
sqlalchemy.ext.asyncio.async_scoped_session.__call__(**kw: Any) → _AS¶ Gibt die aktuelle
AsyncSessionzurück und erstellt sie unter Verwendung derscoped_session.session_factory, falls sie noch nicht vorhanden ist.- Parameter:
**kw¶ – Keyword-Argumente werden an den Aufruf von
scoped_session.session_factoryübergeben, falls keine bestehendeAsyncSessionvorhanden ist. Wenn dieAsyncSessionvorhanden ist und Keyword-Argumente übergeben wurden, wirdInvalidRequestErrorausgelöst.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.__init__(session_factory: async_sessionmaker[_AS], scopefunc: Callable[[], Any])¶ Erzeugt eine neue
async_scoped_session.- Parameter:
session_factory¶ – Eine Factory zum Erstellen neuer
AsyncSession-Instanzen. Dies ist normalerweise, aber nicht zwingend, eine Instanz vonasync_sessionmaker.scopefunc¶ – Funktion, die den aktuellen Scope definiert. Eine Funktion wie
asyncio.current_taskkann hier nützlich sein.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async aclose() → None¶ Ein Synonym für
AsyncSession.close().Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Der Name
AsyncSession.aclose()dient speziell zur Unterstützung der Funktion des Kontextmanagers@contextlib.aclosingder Python-Standardbibliothek.Neu in Version 2.0.20.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.add(instance: object, _warn: bool = True) → None¶ Platziert ein Objekt in diese
Session.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Objekte, die sich im transient Zustand befinden, wenn sie an die Methode
Session.add()übergeben werden, wechseln in den pending Zustand, bis zum nächsten Flush, an dem sie in den persistent Zustand übergehen.Objekte, die sich im detached Zustand befinden, wenn sie an die Methode
Session.add()übergeben werden, wechseln direkt in den persistent Zustand.Wenn die von der
Sessionverwendete Transaktion zurückgesetzt wird, werden Objekte, die im transienten Zustand waren, als sie anSession.add()übergeben wurden, zurück in den transient Zustand versetzt und sind nicht mehr in dieserSessionvorhanden.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.add_all(instances: Iterable[object]) → None¶ Fügt die gegebene Sammlung von Instanzen zu dieser
Sessionhinzu.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Siehe die Dokumentation für
Session.add()für eine allgemeine Verhaltensbeschreibung.
-
attribute
sqlalchemy.ext.asyncio.async_scoped_session.autoflush¶ Proxy für das Attribut
Session.autoflushim Namen der KlasseAsyncSession.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.begin() → AsyncSessionTransaction¶ Gibt ein
AsyncSessionTransaction-Objekt zurück.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Die zugrunde liegende
Sessionführt die „begin“-Aktion aus, wenn das ObjektAsyncSessionTransactionbetreten wirdasync with async_session.begin(): ... # ORM transaction is begun
Beachten Sie, dass Datenbank-I/O normalerweise nicht stattfindet, wenn die Session-Transaktion begonnen wird, da Datenbanktransaktionen nach Bedarf beginnen. Der Begin-Block ist jedoch asynchron, um einen Event-Hook
SessionEvents.after_transaction_create()zu ermöglichen, der I/O durchführen kann.Eine allgemeine Beschreibung von ORM-Begin finden Sie unter
Session.begin().
-
method
sqlalchemy.ext.asyncio.async_scoped_session.begin_nested() → AsyncSessionTransaction¶ Gibt ein
AsyncSessionTransaction-Objekt zurück, das eine „geschachtelte“ Transaktion beginnt, z. B. SAVEPOINT.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Das Verhalten ist dasselbe wie bei
AsyncSession.begin().Eine allgemeine Beschreibung von ORM-Begin-Nested finden Sie unter
Session.begin_nested().Siehe auch
Serielle Isolation / Savepoints / Transaktionales DDL (asyncio-Version) - spezielle Workarounds, die mit dem SQLite asyncio-Treiber erforderlich sind, damit SAVEPOINT korrekt funktioniert.
-
attribute
sqlalchemy.ext.asyncio.async_scoped_session.bind¶ Proxy für das Attribut
AsyncSession.bindim Namen der Klasseasync_scoped_session.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async close() → None¶ Schließt die transaktionalen Ressourcen und ORM-Objekte, die von dieser
AsyncSessionverwendet werden.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.close()- Hauptdokumentation für „close“Schließen - Details zu den Semantiken von
AsyncSession.close()undAsyncSession.reset().
-
async classmethod
sqlalchemy.ext.asyncio.async_scoped_session.close_all() → None¶ Schließt alle
AsyncSession-Sessions.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Deprecated since version 2.0: Die Methode
AsyncSession.close_all()ist veraltet und wird in einer zukünftigen Version entfernt. Bitte beziehen Sie sich aufclose_all_sessions().
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async commit() → None¶ Bestätigt die aktuelle laufende Transaktion.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.commit()- Hauptdokumentation für „commit“
-
method
sqlalchemy.ext.asyncio.async_scoped_session.configure(**kwargs: Any) → None¶ Konfiguriert den von dieser
scoped_sessionverwendetensessionmakerneu.Siehe
sessionmaker.configure().
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async connection(bind_arguments: _BindArguments | None = None, execution_options: CoreExecuteOptionsParameter | None = None, **kw: Any) → AsyncConnection¶ Gibt ein
AsyncConnection-Objekt zurück, das dem transaktionalen Zustand diesesSession-Objekts entspricht.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Diese Methode kann auch verwendet werden, um Ausführungsoptionen für die Datenbankverbindung festzulegen, die von der aktuellen Transaktion verwendet wird.
New in version 1.4.24: **kw-Argumente hinzugefügt, die an die zugrunde liegende Methode
Session.connection()weitergegeben werden.Siehe auch
Session.connection()- Hauptdokumentation für „connection“
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async delete(instance: object) → None¶ Markiert eine Instanz als gelöscht.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Die Datenbank-Löschoperation erfolgt beim
flush().Da diese Operation entlang nicht geladener Beziehungen kaskadieren kann, ist sie awaitable, um diese Abfragen zu ermöglichen.
Siehe auch
Session.delete()- Hauptdokumentation für delete
-
attribute
sqlalchemy.ext.asyncio.async_scoped_session.deleted¶ Die Menge aller Instanzen, die in dieser
Sessionals „gelöscht“ markiert sind.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.
-
attribute
sqlalchemy.ext.asyncio.async_scoped_session.dirty¶ Die Menge aller persistenten Instanzen, die als schmutzig gelten.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Z. B.
some_mapped_object in session.dirty
Instanzen gelten als schmutzig, wenn sie modifiziert, aber nicht gelöscht wurden.
Beachten Sie, dass diese „schmutzige“ Berechnung „optimistisch“ ist; die meisten Attributsetz- oder Sammlungsmodifikationsoperationen markieren eine Instanz als „schmutzig“ und platzieren sie in dieser Menge, auch wenn keine Nettoänderung am Attributwert vorliegt. Beim Flush wird der Wert jedes Attributs mit seinem zuvor gespeicherten Wert verglichen, und wenn keine Nettoänderung vorliegt, wird keine SQL-Operation durchgeführt (dies ist eine aufwändigere Operation, daher wird sie nur beim Flush durchgeführt).
Um zu überprüfen, ob eine Instanz sich ändernde Nettoänderungen an ihren Attributen aufweist, verwenden Sie die Methode
Session.is_modified().
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async execute(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → Result[Any]¶ Führt eine Anweisung aus und gibt ein gepuffertes
Result-Objekt zurück.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.execute()- Hauptdokumentation für execute
-
method
sqlalchemy.ext.asyncio.async_scoped_session.expire(instance: object, attribute_names: Iterable[str] | None = None) → None¶ Lässt die Attribute einer Instanz verfallen.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Markiert die Attribute einer Instanz als veraltet. Wenn auf ein abgelaufenes Attribut als nächstes zugegriffen wird, wird eine Abfrage an den aktuellen transaktionalen Kontext des
Session-Objekts ausgegeben, um alle abgelaufenen Attribute für die gegebene Instanz zu laden. Beachten Sie, dass eine stark isolierte Transaktion dieselben Werte zurückgibt, die in derselben Transaktion zuvor gelesen wurden, unabhängig von Änderungen des Datenbankzustands außerhalb dieser Transaktion.Um alle Objekte in der
Sessiongleichzeitig ablaufen zu lassen, verwenden SieSession.expire_all().Das Standardverhalten des
Session-Objekts ist es, den gesamten Zustand abzulaufen zu lassen, wenn die MethodenSession.rollback()oderSession.commit()aufgerufen werden, damit neue Daten für die neue Transaktion geladen werden können. Aus diesem Grund ist der Aufruf vonSession.expire()nur für den spezifischen Fall sinnvoll, dass eine Nicht-ORM-SQL-Anweisung in der aktuellen Transaktion ausgegeben wurde.- Parameter:
Siehe auch
Aktualisieren / Ablaufen lassen - Einführungsmaterial
-
method
sqlalchemy.ext.asyncio.async_scoped_session.expire_all() → None¶ Lässt alle persistenten Instanzen innerhalb dieser Session verfallen.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Wenn auf irgendein Attribut einer persistenten Instanz als nächstes zugegriffen wird, wird eine Abfrage über den aktuellen transaktionalen Kontext des
Session-Objekts ausgegeben, um alle abgelaufenen Attribute für die gegebene Instanz zu laden. Beachten Sie, dass eine stark isolierte Transaktion dieselben Werte zurückgibt, die in derselben Transaktion zuvor gelesen wurden, unabhängig von Änderungen des Datenbankzustands außerhalb dieser Transaktion.Um einzelne Objekte und einzelne Attribute dieser Objekte ablaufen zu lassen, verwenden Sie
Session.expire().Das Standardverhalten des
Session-Objekts ist es, den gesamten Zustand abzulaufen zu lassen, wenn die MethodenSession.rollback()oderSession.commit()aufgerufen werden, damit neue Daten für die neue Transaktion geladen werden können. Aus diesem Grund ist der Aufruf vonSession.expire_all()normalerweise nicht erforderlich, vorausgesetzt, die Transaktion ist isoliert.Siehe auch
Aktualisieren / Ablaufen lassen - Einführungsmaterial
-
method
sqlalchemy.ext.asyncio.async_scoped_session.expunge(instance: object) → None¶ Entfernt die instance aus dieser
Session.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies gibt alle internen Referenzen auf die Instanz frei. Kaskadierung wird gemäß der *expunge*-Kaskadenregel angewendet.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.expunge_all() → None¶ Entfernt alle Objektinstanzen aus dieser
Session.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies entspricht dem Aufruf von
expunge(obj)für alle Objekte in dieserSession.
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async flush(objects: Sequence[Any] | None = None) → None¶ Flush aller Objektänderungen an die Datenbank.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.flush()- Hauptdokumentation für flush
-
method
sqlalchemy.ext.asyncio.async_scoped_session.async get(entity: _EntityBindKey[_O], ident: _PKIdentityArgument, *, options: Sequence[ORMOption] | None = None, populate_existing: bool = False, with_for_update: ForUpdateParameter = None, identity_token: Any | None = None, execution_options: OrmExecuteOptionsParameter = {}) → _O | None¶ Gibt eine Instanz basierend auf der angegebenen Primärschlüssel-ID zurück, oder
None, wenn sie nicht gefunden wurde.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.get()- Hauptdokumentation für get
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.get_bind(mapper: _EntityBindKey[_O] | None = None, clause: ClauseElement | None = None, bind: _SessionBind | None = None, **kw: Any) → Engine | Connection¶ Gibt eine "Bindung" zurück, an die die synchrone, proxied
Sessiongebunden ist.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Im Gegensatz zur Methode
Session.get_bind()wird diese Methode derzeit von dieserAsyncSessionin keiner Weise verwendet, um Engines für Anfragen aufzulösen.Hinweis
Diese Methode leitet direkt an die Methode
Session.get_bind()weiter, ist jedoch derzeit im Gegensatz zur MethodeSession.get_bind()nicht als Überschreibungsziel nützlich. Das folgende Beispiel zeigt, wie benutzerdefinierteSession.get_bind()-Schemata implementiert werden, die mitAsyncSessionundAsyncEnginefunktionieren.Das Muster, das unter Benutzerdefinierte vertikale Partitionierung eingeführt wurde, zeigt, wie ein benutzerdefiniertes Bindungs-Lookup-Schema auf eine
Sessionangewendet wird, wenn eine Reihe vonEngine-Objekten vorhanden ist. Um eine entsprechendeSession.get_bind()-Implementierung für die Verwendung mitAsyncSessionundAsyncEngine-Objekten anzuwenden, unterklassifizieren Sie weiterhinSessionund wenden Sie sie mitAsyncSession.sync_session_classaufAsyncSessionan. Die innere Methode muss weiterhinEngine-Instanzen zurückgeben, die von einerAsyncEngineüber das AttributAsyncEngine.sync_engineabgerufen werden können.# using example from "Custom Vertical Partitioning" import random from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy.ext.asyncio import async_sessionmaker from sqlalchemy.orm import Session # construct async engines w/ async drivers engines = { "leader": create_async_engine("sqlite+aiosqlite:///leader.db"), "other": create_async_engine("sqlite+aiosqlite:///other.db"), "follower1": create_async_engine("sqlite+aiosqlite:///follower1.db"), "follower2": create_async_engine("sqlite+aiosqlite:///follower2.db"), } class RoutingSession(Session): def get_bind(self, mapper=None, clause=None, **kw): # within get_bind(), return sync engines if mapper and issubclass(mapper.class_, MyOtherClass): return engines["other"].sync_engine elif self._flushing or isinstance(clause, (Update, Delete)): return engines["leader"].sync_engine else: return engines[ random.choice(["follower1", "follower2"]) ].sync_engine # apply to AsyncSession using sync_session_class AsyncSessionMaker = async_sessionmaker(sync_session_class=RoutingSession)
Die Methode
Session.get_bind()wird in einem nicht-asynchronen, implizit nicht-blockierenden Kontext auf die gleiche Weise aufgerufen wie ORM-Event-Hooks und Funktionen, die überAsyncSession.run_sync()aufgerufen werden. Routinen, die SQL-Befehle innerhalb vonSession.get_bind()ausführen möchten, können dies weiterhin mit blockierenden Code tun, der an der Stelle des Aufrufs von IO auf den Datenbanktreibern implizit in asynchrone Aufrufe übersetzt wird.
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async get_one(entity: _EntityBindKey[_O], ident: _PKIdentityArgument, *, options: Sequence[ORMOption] | None = None, populate_existing: bool = False, with_for_update: ForUpdateParameter = None, identity_token: Any | None = None, execution_options: OrmExecuteOptionsParameter = {}) → _O¶ Gibt eine Instanz basierend auf der gegebenen Primärschlüssel-ID zurück, oder löst eine Ausnahme aus, wenn sie nicht gefunden wird.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Löst
sqlalchemy.orm.exc.NoResultFoundaus, wenn die Abfrage keine Zeilen auswählt...versionadded: 2.0.22
Siehe auch
Session.get_one()- Hauptdokumentation für get_one
-
Klassenmethode
sqlalchemy.ext.asyncio.async_scoped_session.identity_key(class_: Type[Any] | None = None, ident: Any | Tuple[Any, ...] = None, *, instance: Any | None = None, row: Row[Any] | RowMapping | None = None, identity_token: Any | None = None) → _IdentityKeyType[Any]¶ Gibt einen Identitätsschlüssel zurück.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies ist ein Alias für
identity_key().
-
Attribut
sqlalchemy.ext.asyncio.async_scoped_session.identity_map¶ Proxy für das Attribut
Session.identity_mapim Namen der KlasseAsyncSession.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.
-
Attribut
sqlalchemy.ext.asyncio.async_scoped_session.info¶ Ein benutzerdefinierbares Dictionary.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Der Anfangswert dieses Wörterbuchs kann über das Argument
infofür den Konstruktor vonSessionoder den Konstruktor vonsessionmakeroder über Factory-Methoden befüllt werden. Das Wörterbuch hier ist immer lokal zu dieserSessionund kann unabhängig von allen anderenSession-Objekten modifiziert werden.
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async invalidate() → None¶ Schließt diese Session, indem die Verbindung ungültig gemacht wird.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Für eine vollständige Beschreibung siehe
Session.invalidate().
-
Attribut
sqlalchemy.ext.asyncio.async_scoped_session.is_active¶ True, wenn diese
Sessionsich nicht im Zustand "partielles Rollback" befindet.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Geändert in Version 1.4: Die
Sessionbeginnt keine neue Transaktion mehr sofort, daher ist dieses Attribut False, wenn dieSessionzum ersten Mal instanziiert wird.Der Zustand "partielles Rollback" zeigt typischerweise an, dass der Flush-Prozess der
Sessionfehlgeschlagen ist und dass die MethodeSession.rollback()aufgerufen werden muss, um die Transaktion vollständig zurückzurollen.Wenn diese
Sessionüberhaupt nicht in einer Transaktion ist, beginnt dieSessionautomatisch, wenn sie zum ersten Mal verwendet wird. In diesem Fall gibtSession.is_activeTrue zurück.Andernfalls, wenn sich diese
Sessioninnerhalb einer Transaktion befindet und diese Transaktion nicht intern zurückgerollt wurde, gibtSession.is_activeebenfalls True zurück.
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.is_modified(instance: object, include_collections: bool = True) → bool¶ Gibt
Truezurück, wenn die gegebene Instanz lokal geänderte Attribute hat.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Diese Methode ruft die Historie für jedes instrumentierte Attribut der Instanz ab und vergleicht den aktuellen Wert mit seinem zuvor geleerten oder committeten Wert, falls vorhanden.
Dies ist im Grunde eine aufwändigere und genauere Version der Prüfung auf die gegebene Instanz in der Sammlung
Session.dirty; es wird eine vollständige Prüfung auf den Netto-"dirty"-Status jedes Attributs durchgeführt.Z. B.
return session.is_modified(someobject)
Einige Vorbehalte zu dieser Methode gelten:
Instanzen, die in der Sammlung
Session.dirtyvorhanden sind, können bei der Prüfung mit dieser MethodeFalsezurückgeben. Dies liegt daran, dass das Objekt möglicherweise Änderungsereignisse durch Attributmutationen erhalten hat, wodurch es inSession.dirtyaufgenommen wurde, aber letztendlich ist der Zustand derselbe wie der aus der Datenbank geladene, was hier zu keiner Nettoänderung führt.Skalare Attribute haben möglicherweise nicht den zuvor gesetzten Wert aufgezeichnet, wenn ein neuer Wert angewendet wurde, falls das Attribut zum Zeitpunkt des Empfangs des neuen Wertes nicht geladen war oder abgelaufen war. In diesen Fällen wird angenommen, dass das Attribut eine Änderung erfahren hat, auch wenn es letztendlich keine Nettobewegung gegenüber seinem Datenbankwert gibt. SQLAlchemy benötigt in den meisten Fällen nicht den „alten“ Wert, wenn ein Set-Ereignis auftritt, und überspringt daher die Kosten eines SQL-Aufrufs, wenn der alte Wert nicht vorhanden ist, basierend auf der Annahme, dass ein UPDATE des skalaren Werts normalerweise erforderlich ist und in den wenigen Fällen, in denen dies nicht der Fall ist, im Durchschnitt weniger kostspielig ist als die Ausgabe eines defensiven SELECTs.
Der "alte" Wert wird bedingungslos beim Setzen abgerufen, nur wenn der Attributcontainer das Flag
active_historyaufTruegesetzt hat. Dieses Flag wird typischerweise für Primärschlüsselattribute und skalare Objektverweise gesetzt, die keine einfache Many-to-One-Beziehung sind. Um dieses Flag für beliebige abgebildete Spalten zu setzen, verwenden Sie das Argumentactive_historymitcolumn_property().
- Parameter:
instance¶ – Abgebildete Instanz, die auf ausstehende Änderungen geprüft werden soll.
include_collections¶ – Gibt an, ob mehrwertige Sammlungen in den Vorgang einbezogen werden sollen. Das Setzen dieses Parameters auf
Falseist eine Möglichkeit, nur lokale Spalten-basierte Eigenschaften (d.h. skalare Spalten oder Many-to-One-Fremdschlüssel) zu erkennen, die bei einem Flush zu einem UPDATE für diese Instanz führen würden.
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async merge(instance: _O, *, load: bool = True, options: Sequence[ORMOption] | None = None) → _O¶ Kopiert den Zustand einer gegebenen Instanz in eine entsprechende Instanz innerhalb dieser
AsyncSession.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.merge()- Hauptdokumentation für merge
-
Attribut
sqlalchemy.ext.asyncio.async_scoped_session.new¶ Die Menge aller Instanzen, die in dieser
Sessionals 'new' markiert sind.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.
-
Attribut
sqlalchemy.ext.asyncio.async_scoped_session.no_autoflush¶ Gibt einen Kontextmanager zurück, der Autoflush deaktiviert.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.z. B.
with session.no_autoflush: some_object = SomeClass() session.add(some_object) # won't autoflush some_object.related_thing = session.query(SomeRelated).first()
Operationen, die innerhalb des
with:Blocks ausgeführt werden, unterliegen keinen Flushes, die beim Zugriff auf Abfragen erfolgen. Dies ist nützlich, wenn eine Reihe von Objekten initialisiert wird, die bestehende Datenbankabfragen beinhalten, wobei das unvollständige Objekt noch nicht geflusht werden soll.
-
Klassenmethode
sqlalchemy.ext.asyncio.async_scoped_session.object_session(instance: object) → Session | None¶ Gibt die
Sessionzurück, zu der ein Objekt gehört.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies ist ein Alias für
object_session().
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async refresh(instance: object, attribute_names: Iterable[str] | None = None, with_for_update: ForUpdateParameter = None) → None¶ Die Attribute der gegebenen Instanz ablaufen lassen und aktualisieren.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Eine Abfrage wird an die Datenbank gesendet und alle Attribute werden mit ihrem aktuellen Datenbankwert aktualisiert.
Dies ist die asynchrone Version der Methode
Session.refresh(). Siehe diese Methode für eine vollständige Beschreibung aller Optionen.Siehe auch
Session.refresh()- Hauptdokumentation für refresh
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async remove() → None¶ Die aktuelle
AsyncSession, falls vorhanden, entsorgen.Anders als die remove-Methode von scoped_session würde diese Methode await verwenden, um auf die close-Methode von AsyncSession zu warten.
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async reset() → None¶ Die transaktionalen Ressourcen und ORM-Objekte schließen, die von dieser
Sessionverwendet werden, und die Session in ihren Anfangszustand zurückversetzen.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Neu in Version 2.0.22.
Siehe auch
Session.reset()- Hauptdokumentation für "reset"Schließen - Details zu den Semantiken von
AsyncSession.close()undAsyncSession.reset().
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async rollback() → None¶ Die aktuelle laufende Transaktion zurückrollen.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.rollback()- Hauptdokumentation für "rollback"
-
Methode
sqlalchemy.ext.asyncio.async_scoped_session.async scalar(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → Any¶ Führt eine Anweisung aus und gibt ein Skalaren-Ergebnis zurück.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.Siehe auch
Session.scalar()- Hauptdokumentation für scalar
-
methode
sqlalchemy.ext.asyncio.async_scoped_session.async scalars(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → ScalarResult[Any]¶ Führt eine Anweisung aus und gibt Skalarergebnisse zurück.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.- Gibt zurück:
ein
ScalarResult-Objekt
Neu in Version 1.4.24:
AsyncSession.scalars()hinzugefügtNeu in Version 1.4.26:
async_scoped_session.scalars()hinzugefügtSiehe auch
Session.scalars()- Hauptdokumentation für SkalareAsyncSession.stream_scalars()- Streaming-Version
-
attribut
sqlalchemy.ext.asyncio.async_scoped_session.session_factory: async_sessionmaker[_AS]¶ Die session_factory, die an __init__ übergeben wird, wird in diesem Attribut gespeichert und kann später abgerufen werden. Dies kann nützlich sein, wenn eine neue, nicht übergeordnete
AsyncSessionbenötigt wird.
-
methode
sqlalchemy.ext.asyncio.async_scoped_session.async stream(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → AsyncResult[Any]¶ Führt eine Anweisung aus und gibt ein Streaming-
AsyncResult-Objekt zurück.Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.
-
methode
sqlalchemy.ext.asyncio.async_scoped_session.async stream_scalars(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → AsyncScalarResult[Any]¶ Führt eine Anweisung aus und gibt einen Stream von Skalarergebnissen zurück.
Proxy für die Klasse
AsyncSessionim Namen der Klasseasync_scoped_session.- Gibt zurück:
ein
AsyncScalarResult-Objekt
Neu in Version 1.4.24.
Siehe auch
Session.scalars()- Hauptdokumentation für SkalareAsyncSession.scalars()- nicht-streaming-Version
-
method
- klasse sqlalchemy.ext.asyncio.AsyncAttrs¶
Mixin-Klasse, die einen awaitable Zugriff auf alle Attribute bereitstellt.
Z. B.
from __future__ import annotations from typing import List from sqlalchemy import ForeignKey from sqlalchemy import func from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import Mapped from sqlalchemy.orm import mapped_column from sqlalchemy.orm import relationship class Base(AsyncAttrs, DeclarativeBase): pass class A(Base): __tablename__ = "a" id: Mapped[int] = mapped_column(primary_key=True) data: Mapped[str] bs: Mapped[List[B]] = relationship() 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]
Im obigen Beispiel wird der
AsyncAttrs-Mixin zur deklariertenBase-Klasse hinzugefügt, wo er für alle Unterklassen wirksam wird. Dieser Mixin fügt allen Klassen ein einziges neues AttributAsyncAttrs.awaitable_attrshinzu, das den Wert jedes Attributs als awaitable liefert. Dies ermöglicht den Zugriff auf Attribute, die möglicherweise träges Laden oder verzögertes/nicht abgelaufenes Laden unterliegen, so dass weiterhin E/A ausgegeben werden kann.a1 = (await async_session.scalars(select(A).where(A.id == 5))).one() # use the lazy loader on ``a1.bs`` via the ``.awaitable_attrs`` # interface, so that it may be awaited for b1 in await a1.awaitable_attrs.bs: print(b1)
Die
AsyncAttrs.awaitable_attrsführt einen Aufruf des Attributs durch, der ungefähr dem Aufruf der MethodeAsyncSession.run_sync()entspricht, z. B.:for b1 in await async_session.run_sync(lambda sess: a1.bs): print(b1)
Neu in Version 2.0.13.
Mitglieder
-
attribut
sqlalchemy.ext.asyncio.AsyncAttrs.awaitable_attrs¶ Stellt einen Namespace für alle Attribute dieses Objekts bereit, die als awaitables verpackt sind.
z. B.
a1 = (await async_session.scalars(select(A).where(A.id == 5))).one() some_attribute = await a1.awaitable_attrs.some_deferred_attribute some_collection = await a1.awaitable_attrs.some_collection
-
attribut
- klasse sqlalchemy.ext.asyncio.AsyncSession¶
Asyncio-Version von
Session.Die
AsyncSessionist ein Proxy für eine traditionelleSession-Instanz.Die
AsyncSessionist **nicht sicher für die Verwendung in parallelen Aufgaben.** Siehe Ist die Session Thread-sicher? Ist AsyncSession sicher für die gemeinsame Nutzung in parallelen Aufgaben? für Hintergrundinformationen.Neu in Version 1.4.
Um eine
AsyncSessionmit benutzerdefiniertenSession-Implementierungen zu verwenden, siehe den ParameterAsyncSession.sync_session_class.Mitglieder
sync_session_class, __init__(), aclose(), add(), add_all(), autoflush, begin(), begin_nested(), close(), close_all(), commit(), connection(), delete(), deleted, dirty, execute(), expire(), expire_all(), expunge(), expunge_all(), flush(), get(), get_bind(), get_nested_transaction(), get_one(), get_transaction(), identity_key(), identity_map, in_nested_transaction(), in_transaction(), info, invalidate(), is_active, is_modified(), merge(), new, no_autoflush, object_session(), refresh(), reset(), rollback(), run_sync(), scalar(), scalars(), stream(), stream_scalars(), sync_session
Klassensignatur
klasse
sqlalchemy.ext.asyncio.AsyncSession(sqlalchemy.ext.asyncio.base.ReversibleProxy)-
attribut
sqlalchemy.ext.asyncio.AsyncSession.sync_session_class: Type[Session] = <class 'sqlalchemy.orm.session.Session'>¶ Die Klasse oder der aufrufbare Wert, der die zugrundeliegende
Session-Instanz für eine bestimmteAsyncSessionbereitstellt.Auf Klassenebene ist dies das Standardattribut für den Parameter
AsyncSession.sync_session_class. Benutzerdefinierte Unterklassen vonAsyncSessionkönnen dies überschreiben.Auf Instanzenebene gibt dieses Attribut die aktuelle Klasse oder den aktuellen aufrufbaren Wert an, der zum Bereitstellen der
Session-Instanz für dieseAsyncSession-Instanz verwendet wurde.Neu in Version 1.4.24.
-
methode
sqlalchemy.ext.asyncio.AsyncSession.__init__(bind: _AsyncSessionBind | None = None, *, binds: Dict[_SessionBindKey, _AsyncSessionBind] | None = None, sync_session_class: Type[Session] | None = None, **kw: Any)¶ Konstruiert eine neue
AsyncSession.Alle Parameter außer
sync_session_classwerden direkt an densync_session_class-Aufruf übergeben, um eine neueSessionzu instanziieren. Informationen zu Parametern finden Sie unterSession.__init__().- Parameter:
sync_session_class¶ –
Eine Unterklasse von
Sessionoder ein anderer aufrufbarer Wert, der zum Erstellen derSessionverwendet wird, die proxied werden soll. Dieser Parameter kann verwendet werden, um benutzerdefinierte Unterklassen vonSessionbereitzustellen. Standardmäßig ist dies das KlassenattributAsyncSession.sync_session_class.Neu in Version 1.4.24.
-
methode
sqlalchemy.ext.asyncio.AsyncSession.async aclose() → None¶ Ein Synonym für
AsyncSession.close().Der Name
AsyncSession.aclose()dient speziell zur Unterstützung der Funktion des Kontextmanagers@contextlib.aclosingder Python-Standardbibliothek.Neu in Version 2.0.20.
-
methode
sqlalchemy.ext.asyncio.AsyncSession.add(instance: object, _warn: bool = True) → None¶ Platziert ein Objekt in diese
Session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Objekte, die sich im transient Zustand befinden, wenn sie an die Methode
Session.add()übergeben werden, wechseln in den pending Zustand, bis zum nächsten Flush, an dem sie in den persistent Zustand übergehen.Objekte, die sich im detached Zustand befinden, wenn sie an die Methode
Session.add()übergeben werden, wechseln direkt in den persistent Zustand.Wenn die von der
Sessionverwendete Transaktion zurückgesetzt wird, werden Objekte, die im transienten Zustand waren, als sie anSession.add()übergeben wurden, zurück in den transient Zustand versetzt und sind nicht mehr in dieserSessionvorhanden.
-
methode
sqlalchemy.ext.asyncio.AsyncSession.add_all(instances: Iterable[object]) → None¶ Fügt die gegebene Sammlung von Instanzen zu dieser
Sessionhinzu.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Siehe die Dokumentation für
Session.add()für eine allgemeine Verhaltensbeschreibung.
-
attribut
sqlalchemy.ext.asyncio.AsyncSession.autoflush¶ Proxy für das Attribut
Session.autoflushim Namen der KlasseAsyncSession.
-
methode
sqlalchemy.ext.asyncio.AsyncSession.begin() → AsyncSessionTransaction¶ Gibt ein
AsyncSessionTransaction-Objekt zurück.Die zugrunde liegende
Sessionführt die „begin“-Aktion aus, wenn das ObjektAsyncSessionTransactionbetreten wirdasync with async_session.begin(): ... # ORM transaction is begun
Beachten Sie, dass Datenbank-I/O normalerweise nicht stattfindet, wenn die Session-Transaktion begonnen wird, da Datenbanktransaktionen nach Bedarf beginnen. Der Begin-Block ist jedoch asynchron, um einen Event-Hook
SessionEvents.after_transaction_create()zu ermöglichen, der I/O durchführen kann.Eine allgemeine Beschreibung von ORM-Begin finden Sie unter
Session.begin().
-
methode
sqlalchemy.ext.asyncio.AsyncSession.begin_nested() → AsyncSessionTransaction¶ Gibt ein
AsyncSessionTransaction-Objekt zurück, das eine „geschachtelte“ Transaktion beginnt, z. B. SAVEPOINT.Das Verhalten ist dasselbe wie bei
AsyncSession.begin().Eine allgemeine Beschreibung von ORM-Begin-Nested finden Sie unter
Session.begin_nested().Siehe auch
Serielle Isolation / Savepoints / Transaktionales DDL (asyncio-Version) - spezielle Workarounds, die mit dem SQLite asyncio-Treiber erforderlich sind, damit SAVEPOINT korrekt funktioniert.
-
methode
sqlalchemy.ext.asyncio.AsyncSession.async close() → None¶ Schließt die transaktionalen Ressourcen und ORM-Objekte, die von dieser
AsyncSessionverwendet werden.Siehe auch
Session.close()- Hauptdokumentation für „close“Schließen - Details zu den Semantiken von
AsyncSession.close()undAsyncSession.reset().
-
async classmethod
sqlalchemy.ext.asyncio.AsyncSession.close_all() → None¶ Schließt alle
AsyncSession-Sessions.Deprecated since version 2.0: Die Methode
AsyncSession.close_all()ist veraltet und wird in einer zukünftigen Version entfernt. Bitte beziehen Sie sich aufclose_all_sessions().
-
methode
sqlalchemy.ext.asyncio.AsyncSession.async commit() → None¶ Bestätigt die aktuelle laufende Transaktion.
Siehe auch
Session.commit()- Hauptdokumentation für „commit“
-
methode
sqlalchemy.ext.asyncio.AsyncSession.async connection(bind_arguments: _BindArguments | None = None, execution_options: CoreExecuteOptionsParameter | None = None, **kw: Any) → AsyncConnection¶ Gibt ein
AsyncConnection-Objekt zurück, das dem transaktionalen Zustand diesesSession-Objekts entspricht.Diese Methode kann auch verwendet werden, um Ausführungsoptionen für die Datenbankverbindung festzulegen, die von der aktuellen Transaktion verwendet wird.
New in version 1.4.24: **kw-Argumente hinzugefügt, die an die zugrunde liegende Methode
Session.connection()weitergegeben werden.Siehe auch
Session.connection()- Hauptdokumentation für „connection“
-
methode
sqlalchemy.ext.asyncio.AsyncSession.async delete(instance: object) → None¶ Markiert eine Instanz als gelöscht.
Die Datenbank-Löschoperation erfolgt beim
flush().Da diese Operation entlang nicht geladener Beziehungen kaskadieren kann, ist sie awaitable, um diese Abfragen zu ermöglichen.
Siehe auch
Session.delete()- Hauptdokumentation für delete
-
attribut
sqlalchemy.ext.asyncio.AsyncSession.deleted¶ Die Menge aller Instanzen, die in dieser
Sessionals „gelöscht“ markiert sind.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.
-
attribut
sqlalchemy.ext.asyncio.AsyncSession.dirty¶ Die Menge aller persistenten Instanzen, die als schmutzig gelten.
Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Z. B.
some_mapped_object in session.dirty
Instanzen gelten als schmutzig, wenn sie modifiziert, aber nicht gelöscht wurden.
Beachten Sie, dass diese „schmutzige“ Berechnung „optimistisch“ ist; die meisten Attributsetz- oder Sammlungsmodifikationsoperationen markieren eine Instanz als „schmutzig“ und platzieren sie in dieser Menge, auch wenn keine Nettoänderung am Attributwert vorliegt. Beim Flush wird der Wert jedes Attributs mit seinem zuvor gespeicherten Wert verglichen, und wenn keine Nettoänderung vorliegt, wird keine SQL-Operation durchgeführt (dies ist eine aufwändigere Operation, daher wird sie nur beim Flush durchgeführt).
Um zu überprüfen, ob eine Instanz sich ändernde Nettoänderungen an ihren Attributen aufweist, verwenden Sie die Methode
Session.is_modified().
-
methode
sqlalchemy.ext.asyncio.AsyncSession.async execute(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → Result[Any]¶ Führt eine Anweisung aus und gibt ein gepuffertes
Result-Objekt zurück.Siehe auch
Session.execute()- Hauptdokumentation für execute
-
method
sqlalchemy.ext.asyncio.AsyncSession.expire(instance: object, attribute_names: Iterable[str] | None = None) → None¶ Lässt die Attribute einer Instanz verfallen.
Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Markiert die Attribute einer Instanz als veraltet. Wenn auf ein abgelaufenes Attribut als nächstes zugegriffen wird, wird eine Abfrage an den aktuellen transaktionalen Kontext des
Session-Objekts ausgegeben, um alle abgelaufenen Attribute für die gegebene Instanz zu laden. Beachten Sie, dass eine stark isolierte Transaktion dieselben Werte zurückgibt, die in derselben Transaktion zuvor gelesen wurden, unabhängig von Änderungen des Datenbankzustands außerhalb dieser Transaktion.Um alle Objekte in der
Sessiongleichzeitig ablaufen zu lassen, verwenden SieSession.expire_all().Das Standardverhalten des
Session-Objekts ist es, den gesamten Zustand abzulaufen zu lassen, wenn die MethodenSession.rollback()oderSession.commit()aufgerufen werden, damit neue Daten für die neue Transaktion geladen werden können. Aus diesem Grund ist der Aufruf vonSession.expire()nur für den spezifischen Fall sinnvoll, dass eine Nicht-ORM-SQL-Anweisung in der aktuellen Transaktion ausgegeben wurde.- Parameter:
Siehe auch
Aktualisieren / Ablaufen lassen - Einführungsmaterial
-
method
sqlalchemy.ext.asyncio.AsyncSession.expire_all() → None¶ Lässt alle persistenten Instanzen innerhalb dieser Session verfallen.
Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Wenn auf irgendein Attribut einer persistenten Instanz als nächstes zugegriffen wird, wird eine Abfrage über den aktuellen transaktionalen Kontext des
Session-Objekts ausgegeben, um alle abgelaufenen Attribute für die gegebene Instanz zu laden. Beachten Sie, dass eine stark isolierte Transaktion dieselben Werte zurückgibt, die in derselben Transaktion zuvor gelesen wurden, unabhängig von Änderungen des Datenbankzustands außerhalb dieser Transaktion.Um einzelne Objekte und einzelne Attribute dieser Objekte ablaufen zu lassen, verwenden Sie
Session.expire().Das Standardverhalten des
Session-Objekts ist es, den gesamten Zustand abzulaufen zu lassen, wenn die MethodenSession.rollback()oderSession.commit()aufgerufen werden, damit neue Daten für die neue Transaktion geladen werden können. Aus diesem Grund ist der Aufruf vonSession.expire_all()normalerweise nicht erforderlich, vorausgesetzt, die Transaktion ist isoliert.Siehe auch
Aktualisieren / Ablaufen lassen - Einführungsmaterial
-
method
sqlalchemy.ext.asyncio.AsyncSession.expunge(instance: object) → None¶ Entfernt die instance aus dieser
Session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies gibt alle internen Referenzen auf die Instanz frei. Kaskadierung wird gemäß der *expunge*-Kaskadenregel angewendet.
-
method
sqlalchemy.ext.asyncio.AsyncSession.expunge_all() → None¶ Entfernt alle Objektinstanzen aus dieser
Session.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies entspricht dem Aufruf von
expunge(obj)für alle Objekte in dieserSession.
-
method
sqlalchemy.ext.asyncio.AsyncSession.async flush(objects: Sequence[Any] | None = None) → None¶ Flush aller Objektänderungen an die Datenbank.
Siehe auch
Session.flush()- Hauptdokumentation für flush
-
method
sqlalchemy.ext.asyncio.AsyncSession.async get(entity: _EntityBindKey[_O], ident: _PKIdentityArgument, *, options: Sequence[ORMOption] | None = None, populate_existing: bool = False, with_for_update: ForUpdateParameter = None, identity_token: Any | None = None, execution_options: OrmExecuteOptionsParameter = {}) → _O | None¶ Gibt eine Instanz basierend auf der angegebenen Primärschlüssel-ID zurück, oder
None, wenn sie nicht gefunden wurde.Siehe auch
Session.get()- Hauptdokumentation für get
-
method
sqlalchemy.ext.asyncio.AsyncSession.get_bind(mapper: _EntityBindKey[_O] | None = None, clause: ClauseElement | None = None, bind: _SessionBind | None = None, **kw: Any) → Engine | Connection¶ Gibt eine "Bindung" zurück, an die die synchrone, proxied
Sessiongebunden ist.Im Gegensatz zur Methode
Session.get_bind()wird diese Methode derzeit von dieserAsyncSessionin keiner Weise verwendet, um Engines für Anfragen aufzulösen.Hinweis
Diese Methode leitet direkt an die Methode
Session.get_bind()weiter, ist jedoch derzeit im Gegensatz zur MethodeSession.get_bind()nicht als Überschreibungsziel nützlich. Das folgende Beispiel zeigt, wie benutzerdefinierteSession.get_bind()-Schemata implementiert werden, die mitAsyncSessionundAsyncEnginefunktionieren.Das Muster, das unter Benutzerdefinierte vertikale Partitionierung eingeführt wurde, zeigt, wie ein benutzerdefiniertes Bindungs-Lookup-Schema auf eine
Sessionangewendet wird, wenn eine Reihe vonEngine-Objekten vorhanden ist. Um eine entsprechendeSession.get_bind()-Implementierung für die Verwendung mitAsyncSessionundAsyncEngine-Objekten anzuwenden, unterklassifizieren Sie weiterhinSessionund wenden Sie sie mitAsyncSession.sync_session_classaufAsyncSessionan. Die innere Methode muss weiterhinEngine-Instanzen zurückgeben, die von einerAsyncEngineüber das AttributAsyncEngine.sync_engineabgerufen werden können.# using example from "Custom Vertical Partitioning" import random from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy.ext.asyncio import async_sessionmaker from sqlalchemy.orm import Session # construct async engines w/ async drivers engines = { "leader": create_async_engine("sqlite+aiosqlite:///leader.db"), "other": create_async_engine("sqlite+aiosqlite:///other.db"), "follower1": create_async_engine("sqlite+aiosqlite:///follower1.db"), "follower2": create_async_engine("sqlite+aiosqlite:///follower2.db"), } class RoutingSession(Session): def get_bind(self, mapper=None, clause=None, **kw): # within get_bind(), return sync engines if mapper and issubclass(mapper.class_, MyOtherClass): return engines["other"].sync_engine elif self._flushing or isinstance(clause, (Update, Delete)): return engines["leader"].sync_engine else: return engines[ random.choice(["follower1", "follower2"]) ].sync_engine # apply to AsyncSession using sync_session_class AsyncSessionMaker = async_sessionmaker(sync_session_class=RoutingSession)
Die Methode
Session.get_bind()wird in einem nicht-asynchronen, implizit nicht-blockierenden Kontext auf die gleiche Weise aufgerufen wie ORM-Event-Hooks und Funktionen, die überAsyncSession.run_sync()aufgerufen werden. Routinen, die SQL-Befehle innerhalb vonSession.get_bind()ausführen möchten, können dies weiterhin mit blockierenden Code tun, der an der Stelle des Aufrufs von IO auf den Datenbanktreibern implizit in asynchrone Aufrufe übersetzt wird.
-
method
sqlalchemy.ext.asyncio.AsyncSession.get_nested_transaction() → AsyncSessionTransaction | None¶ Gibt die aktuelle verschachtelte Transaktion zurück, falls vorhanden.
- Gibt zurück:
Ein
AsyncSessionTransactionObjekt oderNone.
Neu in Version 1.4.18.
-
method
sqlalchemy.ext.asyncio.AsyncSession.async get_one(entity: _EntityBindKey[_O], ident: _PKIdentityArgument, *, options: Sequence[ORMOption] | None = None, populate_existing: bool = False, with_for_update: ForUpdateParameter = None, identity_token: Any | None = None, execution_options: OrmExecuteOptionsParameter = {}) → _O¶ Gibt eine Instanz basierend auf der gegebenen Primärschlüssel-ID zurück, oder löst eine Ausnahme aus, wenn sie nicht gefunden wird.
Löst
sqlalchemy.orm.exc.NoResultFoundaus, wenn die Abfrage keine Zeilen auswählt...versionadded: 2.0.22
Siehe auch
Session.get_one()- Hauptdokumentation für get_one
-
method
sqlalchemy.ext.asyncio.AsyncSession.get_transaction() → AsyncSessionTransaction | None¶ Gibt die aktuelle Root-Transaktion zurück, falls vorhanden.
- Gibt zurück:
Ein
AsyncSessionTransactionObjekt oderNone.
Neu in Version 1.4.18.
-
classmethod
sqlalchemy.ext.asyncio.AsyncSession.identity_key(class_: Type[Any] | None = None, ident: Any | Tuple[Any, ...] = None, *, instance: Any | None = None, row: Row[Any] | RowMapping | None = None, identity_token: Any | None = None) → _IdentityKeyType[Any]¶ Gibt einen Identitätsschlüssel zurück.
Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies ist ein Alias für
identity_key().
-
attribute
sqlalchemy.ext.asyncio.AsyncSession.identity_map¶ Proxy für das Attribut
Session.identity_mapim Namen der KlasseAsyncSession.
-
method
sqlalchemy.ext.asyncio.AsyncSession.in_nested_transaction() → bool¶ Gibt True zurück, wenn diese
Sessioneine verschachtelte Transaktion begonnen hat, z. B. SAVEPOINT.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Neu in Version 1.4.
-
method
sqlalchemy.ext.asyncio.AsyncSession.in_transaction() → bool¶ Gibt True zurück, wenn diese
Sessioneine Transaktion begonnen hat.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Neu in Version 1.4.
Siehe auch
-
attribute
sqlalchemy.ext.asyncio.AsyncSession.info¶ Ein benutzerdefinierbares Dictionary.
Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Der Anfangswert dieses Wörterbuchs kann über das Argument
infofür den Konstruktor vonSessionoder den Konstruktor vonsessionmakeroder über Factory-Methoden befüllt werden. Das Wörterbuch hier ist immer lokal zu dieserSessionund kann unabhängig von allen anderenSession-Objekten modifiziert werden.
-
method
sqlalchemy.ext.asyncio.AsyncSession.async invalidate() → None¶ Schließt diese Session, indem die Verbindung ungültig gemacht wird.
Für eine vollständige Beschreibung siehe
Session.invalidate().
-
attribute
sqlalchemy.ext.asyncio.AsyncSession.is_active¶ True, wenn diese
Sessionsich nicht im Zustand "partielles Rollback" befindet.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Geändert in Version 1.4: Die
Sessionbeginnt keine neue Transaktion mehr sofort, daher ist dieses Attribut False, wenn dieSessionzum ersten Mal instanziiert wird.Der Zustand "partielles Rollback" zeigt typischerweise an, dass der Flush-Prozess der
Sessionfehlgeschlagen ist und dass die MethodeSession.rollback()aufgerufen werden muss, um die Transaktion vollständig zurückzurollen.Wenn diese
Sessionüberhaupt nicht in einer Transaktion ist, beginnt dieSessionautomatisch, wenn sie zum ersten Mal verwendet wird. In diesem Fall gibtSession.is_activeTrue zurück.Andernfalls, wenn sich diese
Sessioninnerhalb einer Transaktion befindet und diese Transaktion nicht intern zurückgerollt wurde, gibtSession.is_activeebenfalls True zurück.
-
method
sqlalchemy.ext.asyncio.AsyncSession.is_modified(instance: object, include_collections: bool = True) → bool¶ Gibt
Truezurück, wenn die gegebene Instanz lokal geänderte Attribute hat.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Diese Methode ruft die Historie für jedes instrumentierte Attribut der Instanz ab und vergleicht den aktuellen Wert mit seinem zuvor geleerten oder committeten Wert, falls vorhanden.
Dies ist im Grunde eine aufwändigere und genauere Version der Prüfung auf die gegebene Instanz in der Sammlung
Session.dirty; es wird eine vollständige Prüfung auf den Netto-"dirty"-Status jedes Attributs durchgeführt.Z. B.
return session.is_modified(someobject)
Einige Vorbehalte zu dieser Methode gelten:
Instanzen, die in der Sammlung
Session.dirtyvorhanden sind, können bei der Prüfung mit dieser MethodeFalsezurückgeben. Dies liegt daran, dass das Objekt möglicherweise Änderungsereignisse durch Attributmutationen erhalten hat, wodurch es inSession.dirtyaufgenommen wurde, aber letztendlich ist der Zustand derselbe wie der aus der Datenbank geladene, was hier zu keiner Nettoänderung führt.Skalare Attribute haben möglicherweise nicht den zuvor gesetzten Wert aufgezeichnet, wenn ein neuer Wert angewendet wurde, falls das Attribut zum Zeitpunkt des Empfangs des neuen Wertes nicht geladen war oder abgelaufen war. In diesen Fällen wird angenommen, dass das Attribut eine Änderung erfahren hat, auch wenn es letztendlich keine Nettobewegung gegenüber seinem Datenbankwert gibt. SQLAlchemy benötigt in den meisten Fällen nicht den „alten“ Wert, wenn ein Set-Ereignis auftritt, und überspringt daher die Kosten eines SQL-Aufrufs, wenn der alte Wert nicht vorhanden ist, basierend auf der Annahme, dass ein UPDATE des skalaren Werts normalerweise erforderlich ist und in den wenigen Fällen, in denen dies nicht der Fall ist, im Durchschnitt weniger kostspielig ist als die Ausgabe eines defensiven SELECTs.
Der "alte" Wert wird bedingungslos beim Setzen abgerufen, nur wenn der Attributcontainer das Flag
active_historyaufTruegesetzt hat. Dieses Flag wird typischerweise für Primärschlüsselattribute und skalare Objektverweise gesetzt, die keine einfache Many-to-One-Beziehung sind. Um dieses Flag für beliebige abgebildete Spalten zu setzen, verwenden Sie das Argumentactive_historymitcolumn_property().
- Parameter:
instance¶ – Mapped Instanz, die auf ausstehende Änderungen getestet werden soll.
include_collections¶ – Gibt an, ob mehrwertige Sammlungen in die Operation einbezogen werden sollen. Das Setzen auf
Falseist eine Möglichkeit, nur lokale spaltenbasierte Eigenschaften (d. h. skalare Spalten oder Many-to-One-Fremdschlüssel) zu erkennen, die bei einem Flush zu einem UPDATE für diese Instanz führen würden.
-
method
sqlalchemy.ext.asyncio.AsyncSession.async merge(instance: _O, *, load: bool = True, options: Sequence[ORMOption] | None = None) → _O¶ Kopiert den Zustand einer gegebenen Instanz in eine entsprechende Instanz innerhalb dieser
AsyncSession.Siehe auch
Session.merge()- Hauptdokumentation für merge
-
attribute
sqlalchemy.ext.asyncio.AsyncSession.new¶ Die Menge aller Instanzen, die in dieser
Sessionals 'new' markiert sind.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.
-
attribute
sqlalchemy.ext.asyncio.AsyncSession.no_autoflush¶ Gibt einen Kontextmanager zurück, der Autoflush deaktiviert.
Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.z. B.
with session.no_autoflush: some_object = SomeClass() session.add(some_object) # won't autoflush some_object.related_thing = session.query(SomeRelated).first()
Operationen, die innerhalb des
with:Blocks ausgeführt werden, unterliegen keinen Flushes, die beim Zugriff auf Abfragen erfolgen. Dies ist nützlich, wenn eine Reihe von Objekten initialisiert wird, die bestehende Datenbankabfragen beinhalten, wobei das unvollständige Objekt noch nicht geflusht werden soll.
-
classmethod
sqlalchemy.ext.asyncio.AsyncSession.object_session(instance: object) → Session | None¶ Gibt die
Sessionzurück, zu der ein Objekt gehört.Proxy für die Klasse
Sessionim Namen der KlasseAsyncSession.Dies ist ein Alias für
object_session().
-
method
sqlalchemy.ext.asyncio.AsyncSession.async refresh(instance: object, attribute_names: Iterable[str] | None = None, with_for_update: ForUpdateParameter = None) → None¶ Die Attribute der gegebenen Instanz ablaufen lassen und aktualisieren.
Eine Abfrage wird an die Datenbank gesendet und alle Attribute werden mit ihrem aktuellen Datenbankwert aktualisiert.
Dies ist die asynchrone Version der Methode
Session.refresh(). Siehe diese Methode für eine vollständige Beschreibung aller Optionen.Siehe auch
Session.refresh()- Hauptdokumentation für refresh
-
method
sqlalchemy.ext.asyncio.AsyncSession.async reset() → None¶ Die transaktionalen Ressourcen und ORM-Objekte schließen, die von dieser
Sessionverwendet werden, und die Session in ihren Anfangszustand zurückversetzen.Neu in Version 2.0.22.
Siehe auch
Session.reset()- Hauptdokumentation für "reset"Schließen - Details zu den Semantiken von
AsyncSession.close()undAsyncSession.reset().
-
method
sqlalchemy.ext.asyncio.AsyncSession.async rollback() → None¶ Die aktuelle laufende Transaktion zurückrollen.
Siehe auch
Session.rollback()- Hauptdokumentation für "rollback"
-
method
sqlalchemy.ext.asyncio.AsyncSession.async run_sync(fn: ~typing.Callable[[~typing.Concatenate[~sqlalchemy.orm.session.Session, ~_P]], ~sqlalchemy.ext.asyncio.session._T], *arg: ~typing.~_P, **kw: ~typing.~_P) → _T¶ Ruft den gegebenen synchronen (d. h. nicht asynchronen) Callable auf und übergibt eine synchrone
Sessionals erstes Argument.This method allows traditional synchronous SQLAlchemy functions to run within the context of an asyncio application.
Z. B.
def some_business_method(session: Session, param: str) -> str: """A synchronous function that does not require awaiting :param session: a SQLAlchemy Session, used synchronously :return: an optional return value is supported """ session.add(MyObject(param=param)) session.flush() return "success" async def do_something_async(async_engine: AsyncEngine) -> None: """an async function that uses awaiting""" with AsyncSession(async_engine) as async_session: # run some_business_method() with a sync-style # Session, proxied into an awaitable return_code = await async_session.run_sync( some_business_method, param="param1" ) print(return_code)
This method maintains the asyncio event loop all the way through to the database connection by running the given callable in a specially instrumented greenlet.
Tipp
The provided callable is invoked inline within the asyncio event loop, and will block on traditional IO calls. IO within this callable should only call into SQLAlchemy’s asyncio database APIs which will be properly adapted to the greenlet context.
Siehe auch
AsyncAttrs- ein Mixin für ORM-gemappte Klassen, das eine ähnliche Funktionalität pro Attribut prägnanter bereitstellt.
-
method
sqlalchemy.ext.asyncio.AsyncSession.async scalar(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → Any¶ Führt eine Anweisung aus und gibt ein Skalaren-Ergebnis zurück.
Siehe auch
Session.scalar()- Hauptdokumentation für scalar
-
method
sqlalchemy.ext.asyncio.AsyncSession.async scalars(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → ScalarResult[Any]¶ Führt eine Anweisung aus und gibt Skalarergebnisse zurück.
- Gibt zurück:
ein
ScalarResult-Objekt
Neu in Version 1.4.24:
AsyncSession.scalars()hinzugefügtNeu in Version 1.4.26:
async_scoped_session.scalars()hinzugefügtSiehe auch
Session.scalars()- Hauptdokumentation für SkalareAsyncSession.stream_scalars()- Streaming-Version
-
method
sqlalchemy.ext.asyncio.AsyncSession.async stream(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → AsyncResult[Any]¶ Führt eine Anweisung aus und gibt ein Streaming-
AsyncResult-Objekt zurück.
-
Methode
sqlalchemy.ext.asyncio.AsyncSession.asynchron stream_scalars(statement: Executable, params: _CoreAnyExecuteParams | None = None, *, execution_options: OrmExecuteOptionsParameter = {}, bind_arguments: _BindArguments | None = None, **kw: Any) → AsyncScalarResult[Any]¶ Führt eine Anweisung aus und gibt einen Stream von Skalarergebnissen zurück.
- Gibt zurück:
ein
AsyncScalarResult-Objekt
Neu in Version 1.4.24.
Siehe auch
Session.scalars()- Hauptdokumentation für SkalareAsyncSession.scalars()- nicht-streaming-Version
-
Attribut
sqlalchemy.ext.asyncio.AsyncSession.sync_session: Session¶ Verweis auf die zugrunde liegende
Session, an dieAsyncSessionAnfragen weiterleitet.Diese Instanz kann als Ereignisziel verwendet werden.
-
attribut
- Klasse sqlalchemy.ext.asyncio.AsyncSessionTransaction¶
Ein Wrapper für das ORM
SessionTransaction-Objekt.Dieses Objekt wird bereitgestellt, damit ein transaktionshaltendes Objekt für die
AsyncSession.begin()zurückgegeben werden kann.Das Objekt unterstützt sowohl explizite Aufrufe von
AsyncSessionTransaction.commit()undAsyncSessionTransaction.rollback()als auch die Verwendung als asynchroner Kontextmanager.Neu in Version 1.4.
Mitglieder
Klassensignatur
Klasse
sqlalchemy.ext.asyncio.AsyncSessionTransaction(sqlalchemy.ext.asyncio.base.ReversibleProxy,sqlalchemy.ext.asyncio.base.StartableContext)-
Methode
sqlalchemy.ext.asyncio.AsyncSessionTransaction.asynchron commit() → None¶ Commit dieser
AsyncTransaction.
-
Methode
sqlalchemy.ext.asyncio.AsyncSessionTransaction.asynchron rollback() → None¶ Rollback dieser
AsyncTransaction.
-
Methode
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