Lewati ke isi

transaksi

Transaksi database didukung karena pengkodean / database yang digunakan untuk mengeluarkan kueri asinkron.

Penggunaan dasar

Untuk menggunakan transaksi, gunakan Database.transaksi sebagaimanajer konteks asinkron:

1
2
3
4
5
Sinkronisasi dengan transaksi database ():
    # semua yang disebut di sini akan menjadi satu transaksi
    Tunggu Model1 ().simpan ()
    Tunggu Model2 ().simpan ()
    ...

!!!Perhatikan bahwa itu harus database yang sama yang digunakan dalam objek konfigurasi ormar\ _ model.

Untuk menghindari melewati instance database dalam kode Anda, Anda dapat mengekstrak instance dari setiap model. Database yang disediakan selama ormar. Deklarasi model tersedia melalui konfigurasi ormar\ _ dan dapat diakses dari kelas dan instance.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Basis data impor
meter persegi import
Asrama impor


base _ ormar _ config = OrmarConfig (
    Metadata = sqlalchemy. MetaData (),
    Database = database. Database ("sqlite: / / /"),
)


Kelas Penulis (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 255)

# database dapat diakses dari kelas
Database = Penulis ormar _ konfigurasi database

# serta dari contoh
Penulis = Penulis (nama = "Stephen King")
Database = author.database ormar _ konfigurasi

Anda juga dapat menggunakan .transaksi () sebagai dekorator fungsi untuk setiap fungsi asinkron:

1
2
3
@ Database.transaksi ()
Async def membuat _ pengguna (permintaan):
    ...

Blok transaksi dikelola sebagai negara tugas-lokal. Transaksi bersarang didukung penuh dan diimplementasikan menggunakan basis data savepoint.

komitmen / kemunduran manual

Untuk API perdagangan tingkat bawah, Anda dapat memicunya secara manual

1
2
3
4
5
6
7
8
Transaksi = menunggu Database.transaksi ()
Coba:
    Menunggu transaksi. mulai ()
    ...
Kecuali:
    Menunggu transaksi.rollback ()
Lainnya:
    Menunggu transaksi.commit ()

tes

Transaksi juga berguna selama pengujian ketika Anda dapat menerapkan rollback paksa dan tidak perlu membersihkan data setelah setiap pengujian.

1
2
3
4
5
6
@ Pytest.mark.asyncio
Async def sample _ test ():
    Sinkronisasi dengan database:
        Sinkronisasi dengan Database.transaksi (force _ rollback = Benar):
            # kode pengujian Anda di sini
            ...