首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:如何在数据迁移中使用异步任务?

Django:如何在数据迁移中使用异步任务?
EN

Stack Overflow用户
提问于 2020-02-14 13:23:27
回答 1查看 297关注 0票数 1

我正在尝试使用数据迁移来填充我的数据库,但是我面对的是RuntimeWarning,并且数据没有被插入。

在填充函数中,我尝试以这种方式在api调用中使用Async Await:

代码语言:javascript
复制
async def populate_table(apps, schema_editor):
    some stuff...
    await api_call_1()...
    for i in range():
       await api_call_2()... #an api call inside a for loop (Async inside Sync is ok?)#
    model.save()

然后,我在我的迁移类中:

代码语言:javascript
复制
class Migration(migrations.Migration):

    dependencies = [
        ('myapp', 'the previous migration'),
    ]

    operations = [
        migrations.RunPython(populate_table)
    ]

运行迁移时将引发运行时警告:

代码语言:javascript
复制
RuntimeWarning: coroutine 'populate_table' was never awaited

所以我尝试用Async/Await来装饰我的Migration类,但没有成功。我做了一些研究,似乎我需要使用事件循环。如何做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2021-03-04 06:15:22

这似乎是一种使用asgiref的async_to_syncsync_to_async工作的方法:

代码语言:javascript
复制
from asgiref.sync import async_to_sync, sync_to_async

@async_to_sync
async def forward_func(apps, schema_editor):
    await api_call_1()
    for i in range():
        await api_call_2()
    await sync_to_async(model.save)()

需要访问数据库的同步函数应该包装在sync_to_async中,然后等待。

这可能有点单调乏味,所以分离异步代码可能是一种好方法,如下所示:

代码语言:javascript
复制
def forward_func(apps, schema_editor):
    @async_to_sync
    def get_data_from_the_api():
        ...

    api_data = get_data_from_the_api()
    ...
    model.save()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60220433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档