Django 3.0 - соединения с базой данных не закрываются после асинхронных c тестов - PullRequest
2 голосов
/ 15 февраля 2020

Я использую Django ORM внутри asyn c кода. Все отлично работает и все тесты проходят. Однако соединения БД не закрываются должным образом после испытаний. Вот пример:

from asgiref.sync import sync_to_async, async_to_sync


@sync_to_async
def count_books():
    return Book.objects.count()


class FooTest(TestCase):
    def setUp(self):
        Book.objects.create(title='Haha')

    def test1(self):
        import asyncio
        c = asyncio.run(count_books())
        self.assertEqual(1, c)

    def test2(self):
        c = async_to_sync(count_books)()
        self.assertEqual(1, c)

Postgres ошибка:

django.db.utils.OperationalError: database "test_mydbname" is being accessed by other users

Ошибка Sqlite:

sqlite3.OperationalError: database table is locked: test_mydbname

Я пытался поменять sync_to_async на database_sync_to_async из django -каналов, но это ничего не изменило.

Как я могу это исправить?

1 Ответ

1 голос
/ 15 февраля 2020

Проблема связана с тем, как ваши asyn c runloops взаимодействуют с основным потоком, обработка этого самостоятельно может стать довольно сложной.

Для тестирования django-channels Я предлагаю использовать pytest с pytest-asyncio для тестирования каналов. И, конечно, pytest-django.

. Это обеспечит несколько полезных инструментов для тестирования асин c кода.

@pytest.mark.django_db(transaction=True)
@pytest.mark.asyncio
async def test1():
    count = await database_sync_to_async(Book.objects.count)
    ....

, а некоторые примеры того, как тестировать код каналов, можно посмотреть здесь .

...