Die Idee besteht darin, eine Live-Verbindung zum Anrufer herzustellen, sicherzustellen, dass sie mit async/await verwendet werden kann, und eine Bereinigung (Verbindung schließen) zu garantieren, sobald der Anrufer fertig ist.
Ein vereinfachtes Beispiel für das, was ich versuche:
Code: Select all
from typing import AsyncGenerator
import asyncpg
async def get_db_connection() -> AsyncGenerator[asyncpg.Connection, None]:
conn = await asyncpg.connect(dsn="postgresql://user:pass@localhost/db")
try:
yield conn
finally:
await conn.close()
Code: Select all
async for conn in get_db_connection():
await conn.execute("INSERT INTO users VALUES ($1)", "Alice")
- Ist die Verwendung eines asynchronen Generators wie dieses ein empfohlenes Muster für die Verwaltung von Datenbankverbindungslebenszyklen?
- Gibt es versteckte Fallstricke in Bezug auf Fehlerbehandlung, Abbruch oder Verbindungslecks?
- Ist dieser Ansatz besser oder schlechter als die Verwendung eines @asynccontextmanager aus contextlib?
- Wie lässt sich dieser skalieren, wenn er mit Verbindungspools anstelle einer einzelnen Verbindung verwendet wird?
Mobile version