Перейти к содержанию

Торговля

Операции базы данных поддерживаются за счет кодирования/базы данных, используемых для подачи асинхронных запросов.

Основные виды применения

Чтобы использовать транзакцию, используйте databasate.transaction в качестве асинхронного контекстного менеджера:

1
2
3
4
5
async with database.transaction():
    Everything Called Here Will Be One Transaction
    await Model1().save(
    await Model2().save()
    ...

!!!Примечание Примечание: она должна быть идентичной базе данных, используемой в объекте ormar_config модели.

Чтобы избежать передачи экземпляров базы данных в коде, вы можете извлечь их из каждой модели. База данных, предоставленная во время объявления ormar.Model, доступна через ormar_config.database и доступна из классов и экземпляров.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Import Data abases
sqimport alchemy
import ormar


Bays_ormar_config (
    metadata= sqalchemy (),
    Database = databases.Database("sqlite://"),
)


Класс автора (ormar.Model):
    ormar_config = base_ormar_config ()

    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =255)

database is accessible from class
database = Author.ormar_config.database

#Как выглядит из Инстаса
Author = Author(name="Стивен Кинг")
database = author.ormar_config.database

Вы также можете использовать.transaction() в качестве декоратора функции для любой асинхронной функции:

1
2
3
database.transaction()
async def create_users (request):
    ...

Блоки транзакций управляются как локальные состояния задачи. Полностью поддерживаются вложенные транзакции и используются точки сохранения базы данных.

Отправить/откат вручную

Для более низкого уровня торгового API вы можете запустить его вручную

1
2
3
4
5
6
7
8
transaction = await database.transaction(
try:
    Transaction.start ()
    ...
except:
    Пересечение (()
else:
    Переводчик ()

Тестирование

Транзакции также полезны во время тестирования, когда можно применить принудительный откат и нет необходимости очищать данные после каждого тестирования.

1
2
3
4
5
6
Pytest.mark asyncio
async def sample_test ():
    async with database
        async with database.transaction(force_rollback =True):
            Ваш код здесь
            ...