Asynkron databasåtkomst
Utforska asynkrona databasklienter och ORM:er som `asyncpg` och `SQLModel` för icke-blockerande databasoperationer.
Asynkron databasåtkomst är en gratis lektion i Bootcamp i backendutveckling med FastAPI på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Bootcamp i backendutveckling med FastAPI, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Bootcamp i backendutveckling med FastAPI innehåller totalt 4 lektioner.
Varför asynkron databasåtkomst?
När ni bygger högpresterande webbapplikationer, särskilt med ramverk som FastAPI, kan databasoperationer ofta bli en flaskhals. Traditionella databasanrop är ”blockerande”, vilket innebär att applikationen väntar på svar från databasen innan den går vidare.
Asynkron databasåtkomst gör att applikationen kan utföra andra uppgifter medan den väntar på databasen. Det förhindrar att API:t blir otillgängligt under hög belastning. Detta är avgörande för skalbarheten!
Synkrona och asynkrona databasanrop
Föreställ er en restaurang där en kock hanterar allt. Om en kund beställer en komplicerad rätt, alltså en databasfråga, slutar kocken med allt annat arbete tills rätten är klar. Detta är synkron I/O.
I en asynkron miljö påbörjar kocken den komplicerade rätten och går sedan direkt vidare med att tillaga enklare rätter eller ta emot nya beställningar medan den komplicerade rätten tillagas i bakgrunden. När rätten är klar hämtar kocken den. Det här icke-blockerande arbetssättet ökar effektiviteten!
Möt asyncpg: den asynkrona drivrutinen
För PostgreSQL är den självklara asynkrona drivrutinen i Python asyncpg. Det är ett högpresterande bibliotek som är särskilt utformat för att fungera med Pythons ramverk asyncio.
- Snabb: Delvis skriven i C för hög hastighet.
- Asynkron: Fullständigt icke-blockerande.
- Direkt: Tillhandahåller ett direkt gränssnitt till PostgreSQL.
Den används ofta som underliggande drivrutin för asynkrona ORM:er eller när ni behöver detaljerad kontroll.
asyncpg i praktiken
Här är ett enkelt exempel på hur ni ansluter till en PostgreSQL-databas och kör en enkel fråga med asyncpg. Kom ihåg att ersätta platshållaruppgifterna med era egna!
import asyncio
import asyncpg
async def main():
conn = None
try:
conn = await asyncpg.connect(user='postgres', password='mysecretpassword',
database='testdb', host='localhost')
print("Connected to PostgreSQL!")
# Execute a query
result = await conn.fetchval('SELECT 1 + 1')
print(f"Query result: {result}") # Should be 2
except Exception as e:
print(f"Error: {e}")
finally:
if conn:
await conn.close()
print("Connection closed.")
if __name__ == "__main__":
asyncio.run(main())Vänta på databasanrop
I föregående exempel såg ni nyckelordet await före asyncpg.connect() och conn.fetchval(). Detta är avgörande för asynkrona operationer.
awaitsäger till Python: ”Den här operationen kan ta tid, så pausa här och låt andra uppgifter köras under tiden.”- När databasoperationen är klar fortsätter uppgiften från den punkt där den pausades.
- Det är den här icke-blockerande väntan som gör FastAPI-applikationen skalbar.
SQLModel: kraften i ett asynkront ORM
Medan asyncpg ger er kontroll på låg nivå förenklar en Object Relational Mapper (ORM) interaktionen med databasen genom att mappa databastabeller till Python-objekt. SQLModel är ett modernt, asynkronitetsinriktat ORM som bygger på:
- Pydantic: För datavalidering och serialisering.
- SQLAlchemy: Det kraftfulla och mogna Python-verktyget för SQL.
Ni kan definiera modeller en gång och använda dem både för API:ts begäranden och svar samt för databasschemat!
Konfigurera SQLModel för asynkron användning
För att använda SQLModel asynkront behöver ni en asynkron databasmotor. Det innebär vanligtvis att ni använder en asynkron drivrutin som asyncpg, som SQLAlchemy kan använda via asyncio. Så här konfigurerar ni motorn:
from sqlmodel import create_engine, SQLModel
import asyncio
# Replace with your actual async PostgreSQL connection string
# The 'postgresql+asyncpg' part tells SQLAlchemy to use asyncpg
DATABASE_URL = "postgresql+asyncpg://postgres:mysecretpassword@localhost/testdb"
async def main():
engine = create_engine(DATABASE_URL, echo=True)
print("Async SQLModel engine created.")
# In a real app, you'd usually create tables here
# async with engine.begin() as conn:
# await conn.run_sync(SQLModel.metadata.create_all)
# Just demonstrating engine creation for this example
await engine.dispose()
print("Engine disposed.")
if __name__ == "__main__":
asyncio.run(main())Er första SQLModel
Det är mycket intuitivt att definiera en modell i SQLModel. Ni ärver från SQLModel och använder fältdeklarationer som liknar Pydantic. Den här enda definitionen skapar både databastabellens schema och API:ts schema för datavalidering!
from typing import Optional
from sqlmodel import Field, SQLModel
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
# This model can now be used with FastAPI for request bodies
# and with SQLAlchemy for database interactions.
print("Hero model defined successfully!")Asynkron CRUD med SQLModel
Nu utför vi en enkel Create- och Read-operation med modellen Hero och den asynkrona motorn. Vi använder AsyncSession från SQLAlchemys ORM för databasinteraktioner.
from typing import Optional
from sqlmodel import Field, SQLModel, create_engine, Session, select
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
import asyncio
DATABASE_URL = "postgresql+asyncpg://postgres:mysecretpassword@localhost/testdb"
async_engine = create_async_engine(DATABASE_URL, echo=False)
AsyncSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=async_engine, class_=AsyncSession)
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
async def create_db_and_tables():
async with async_engine.begin() as conn:
await conn.run_sync(SQLModel.metadata.create_all)
print("Database tables created/updated.")
async def create_hero(hero: Hero):
async with AsyncSessionLocal() as session:
session.add(hero)
await session.commit()
await session.refresh(hero)
print(f"Created hero: {hero.name} (ID: {hero.id})")
return hero
async def get_heroes():
async with AsyncSessionLocal() as session:
statement = select(Hero)
results = await session.execute(statement)
heroes = results.scalars().all()
print("\nAll Heroes:")
for hero in heroes:
print(f"- {hero.name} (Age: {hero.age})")
return heroes
async def main():
await create_db_and_tables()
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson", age=28)
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
await create_hero(hero_1)
await create_hero(hero_2)
await create_hero(hero_3)
await get_heroes()
await async_engine.dispose()
if __name__ == "__main__":
asyncio.run(main())Test av asynkron databasåtkomst
Ni har lärt er om vikten av asynkron databasåtkomst och utforskat verktyg som asyncpg och SQLModel. Nu testar vi er förståelse!
Sammanfattning: asynkron databasåtkomst för skalbarhet
Bra jobbat! Ni har utforskat asynkron databasåtkomst.
- Vi har förstått varför icke-blockerande I/O är avgörande för högpresterande FastAPI-applikationer.
- Vi introducerade
asyncpgsom en asynkron PostgreSQL-drivrutin på låg nivå. - Vi lärde oss om
SQLModel, ett asynkronitetsinriktat ORM som kombinerar Pydantic och SQLAlchemy. - Vi såg praktiska exempel på hur man konfigurerar dessa verktyg och utför CRUD-operationer med dem.
Att behärska asynkrona databasinteraktioner är ett viktigt steg mot att bygga verkligt skalbara och responsiva backend-tjänster!
Lär dig Bootcamp i backendutveckling med FastAPI med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 21
- Lektioner
- 84
Vanliga frågor
Är lektionen ”Asynkron databasåtkomst” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Bootcamp i backendutveckling med FastAPI, inklusive ”Asynkron databasåtkomst”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Bootcamp i backendutveckling med FastAPI innehåller totalt 4 lektioner.
Vad lär jag mig i ”Asynkron databasåtkomst”?
Utforska asynkrona databasklienter och ORM:er som `asyncpg` och `SQLModel` för icke-blockerande databasoperationer. Ni övar på Bootcamp i backendutveckling med FastAPI med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Bootcamp i backendutveckling med FastAPI?
Du behöver inga förkunskaper. Utbildningen i Bootcamp i backendutveckling med FastAPI på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Asynkron databasåtkomst”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Bootcamp i backendutveckling med FastAPI-lektionen?
Ja. Varje Bootcamp i backendutveckling med FastAPI-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Cache-strategier med Redis
- Asynkron databasåtkomst
- Lastbalansering och övervakning
- Bakgrundsuppgifter och job queues