Ga naar inhoud

transactie

Databasetransacties worden ondersteund vanwege de codering / database die wordt gebruikt om asynchrone query 's uit te voeren.

Basisgebruik

Gebruik Database.transactie als asynchrone contextbeheerder om transacties te gebruiken:

1
2
3
4
5
Async met database transactie ():
    # alles wat hier wordt genoemd, zal één transactie zijn
    Wacht op Model1 () .save ()
    Wacht op Model2 () .save ()
    ...

!!!Merk op dat het dezelfde database moet zijn die wordt gebruikt in het ormar\ _ config-object van het model.

Om te voorkomen dat database-instanties in uw code worden doorgegeven, kunt u instanties uit elk model extraheren. De databases die tijdens de ormar worden geleverd. Modeldeclaratie is beschikbaar via ormar\ _ config en is toegankelijk vanuit klassen en instanties.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Databanken importeren
Sqlalchemie invoeren
Ormar importeren


basis _ ormar _ config = OrmarConfig (
    Metadata = sqlalchemie. MetaData (),
    Database = databanken. Database ("sqlite: / / /"),
)


Klasse Auteur (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 255)

# database is toegankelijk vanuit de klas
Database = Auteur ormar _ config database

# evenals van instantie
Auteur = Auteur (naam = "Stephen King")
Database = auteur.database ormar _ config

U kunt .transactie () ook gebruiken als functiedecorateur voor elke asynchrone functie:

1
2
3
@ Database.transactie ()
Async def create _ users (verzoek):
    ...

Transactieblokken worden beheerd als taak-lokale staat. Genestelde transacties worden volledig ondersteund en geïmplementeerd met behulp van database-opslagpunten.

handmatig vastleggen / terugdraaien

Voor handel-API 's op een lager niveau kunt u deze handmatig activeren

1
2
3
4
5
6
7
8
Transactie = wachten Database.transactie ()
Probeer:
    In afwachting van transaction.start ()
    ...
Behalve:
    In afwachting van transaction.rollback ()
Anders:
    In afwachting van transaction.commit ()

proef

Transacties zijn ook handig tijdens het testen wanneer u gedwongen rollbacks kunt toepassen en niet na elke test gegevens hoeft op te schonen.

1
2
3
4
5
6
@ Pytest.mark.asyncio
Async def steekproef _ test ():
    Async met database:
        Async met Database.transactie (force _ rollback = Waar):
            # uw testcode hier
            ...