首页 > 解决方案 > 异步更新数据库上的字典

问题描述

所以我是异步编程的新手,但可能我的问题与赛车条件有关。在这种情况下,我将 Odmantic 与 MongoDB 一起使用。

我正在尝试填充数据库以进行测试,所以我有这些数据,例如:

categories = [
    {
        'name': 'Accessories'
    },
    {
        'name': 'Apparel'
    },
    {
        'name': 'Groceries'
    },
    {
        'name': 'Paints',
        'parent': 'Accessories'
    },
    {
        'name': 'Homewares',
        'parent': 'Accessories'
    },
    {
        'name': 'Audiobooks',
        'parent': 'Accessories'
    },
    {
        'name': 'T-shirts',
        'parent': 'Apparel'
    },
    {
        'name': 'Polo Shirts',
        'parent': 'Apparel'
    },
    {
        'name': 'Hoodies',
        'parent': 'Apparel'
    },
    {
        'name': 'Footwear',
        'parent': 'Apparel'
    },
    {
        'name': 'Juices',
        'parent': 'Groceries'
    },
    {
        'name': 'Alcohol',
        'parent': 'Groceries'
    },
]

所以我是这样开始的:

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    if argv[1] == 'populate':
        loop.run_until_complete(populate())
    elif argv[1] == 'clear':
        loop.run_until_complete(clear())
    loop.close()

我的填充功能:

async def populate():
    tasks = []
    print('\nPopulating Categories:')
    for cat in categories:
        task = help_populate_cats(cat)
        tasks.append(task)
    await asyncio.gather(*tasks)

两个帮手:

async def help_populate_cats(cat):
    category = Category(name=cat.get('name'))
    await category.create()
    await helper_constructor(category)
    print(f"{cat.get('name')} added.")
async def helper_constructor(element):
    for field in element.translations:
        if isinstance(getattr(element, field), str) or not getattr(element, field):
            for lang in available_languages:
                db_language = await Language.get_language(lang)
                if lang == 'en-US':
                    temp_translations = {f'{element.id}_{field}': getattr(element, field)}
                else:
                    temp_translations = {f'{element.id}_{field}': None}
                await db_language.add_strings(temp_translations)

最后是类语言:

class Language(Model, ABC):
    prefix: str
    strings: Optional[dict] = {}

    class Config:
        collection = 'languages'

    @classmethod
    async def get_language(cls, prefix: str) -> "Language":
        return await engine.find_one(cls, cls.prefix == prefix)

    async def add_strings(self, strings: dict):
        self.strings.update(**strings)
        # update_strings(self.prefix, self.strings)
        await self.save()

    async def save(self):
        await engine.save(self)

运行此代码后,我的数据库如下所示这个

Engine Started

Populating Categories:
Homewares added.
Juices added.
T-shirts added.
Groceries added.
Audiobooks added.
Apparel added.
Paints added.
Polo Shirts added.
Accessories added.
Hoodies added.
Alcohol added.
Footwear added.

我有其他项目,如产品类型和属性,它像随机填充数据库(语言部分,创建类别工作正常),有些东西进入其他没有,但如果我在 add_strings 方法上打印,一切都会出现那里(在印刷品上,而不是在数据库上)。

标签: pythondatabaseasynchronous

解决方案


我已经切换了计算机和网络,它工作正常,我随机发现,所以我猜代码是好的。


推荐阅读