Django 3.0—;异步测试后数据库连接未关闭

Django 3.0—;异步测试后数据库连接未关闭,django,python-asyncio,django-channels,django-tests,asgi,Django,Python Asyncio,Django Channels,Django Tests,Asgi,我在异步代码中使用Django ORM。一切正常,所有测试都通过。但是,测试后DB连接不能正确关闭。以下是一个例子: 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.

我在异步代码中使用Django ORM。一切正常,所有测试都通过。但是,测试后DB连接不能正确关闭。以下是一个例子:

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
我曾尝试从django频道将
sync\u切换到\u async
database\u sync\u切换到\u async
,但这没有改变任何事情


如何修复此问题?

问题在于异步运行循环如何与主线程交互,自己处理此问题会变得相当复杂

对于测试
django通道
我建议使用
pytest
pytest asyncio
来测试通道。当然还有pytest django

这将为测试异步代码提供一些有用的工具

@pytest.mark.django_db(事务=True)
@pytest.mark.asyncio
异步def test1():
count=等待数据库同步到异步(Book.objects.count)
....

有关如何测试通道代码的一些示例,请查看。

谢谢!如果我根本不使用django通道呢?我发现我需要测试异步python
pytest asyncio
应该是你的目标,Pytest非常灵活,也可以调用常规的python UnitTest类,因此您可以保留非异步代码的现有测试代码,Pytest会很高兴地调用它。关于django3(orm访问),django还没有提供与
数据库同步到异步的等价物
您是否尝试使用django3.0?