类型错误:“协程”对象不支持异步上下文管理器协议

问题描述 投票:0回答:1

我正在尝试创建邀请经理,但我不断收到此错误

  async with cursor.execute("SELECT id, uses FROM invites WHERE guild_id = ?", (member.guild.id,)) as cursor:
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
Ignoring exception in on_member_join
Traceback (most recent call last):
  File "C:\Users\Zacha\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 378, in _run_event
    await coro(*args, **kwargs)
  File "D:\Projects\SkriptsNet-Bot\modules\invites.py", line 48, in on_member_join
    async with cursor.execute("SELECT id, uses FROM invites WHERE guild_id = ?", (member.guild.id,)) as cursor:
TypeError: 'coroutine' object does not support the asynchronous context manager protocol

这是我当前使用的代码:

    # Member Join Event
        
    @commands.Cog.listener()
    async def on_member_join(self, member):
        async with aiosqlite.connect(self.DB) as db:
            async with db.cursor() as cursor:
                invites = await member.guild.invites()

                c = datetime.today().strftime("%Y-%m-%d").split("-")
                c_y = int(c[0])
                c_m = int(c[1])
                c_d = int(c[2])

                async with cursor.execute("SELECT id, uses FROM invites WHERE guild_id = ?", (member.guild.id)) as cursor:
                    async for invite_id, old_uses in cursor:
                        for invite in invites:
                            if invite.id == invite_id and invite.uses - old_uses > 0:
                                if not (c_y == member.created_at.year and c_m == member.created_at.month and c_d - member.created_at.day < 7):
                                    print(invite.id)
                                    await cursor.execute("UPDATE invites SET uses = uses + 1 WHERE guild_id = ? AND id = ?", (invite.guild.id, invite.id))
                                    await cursor.execute("INSERT OR IGNORE INTO joined (guild_id, inviter_id, joiner_id) VALUES (?,?,?)", (invite.guild.id, invite.inviter.id, member.id))
                                    await cursor.execute("UPDATE totals SET normal = normal + 1 WHERE guild_id = ? AND inviter_id = ?", (invite.guild.id, invite.inviter.id))

                                else:
                                    await cursor.execute("UPDATE totals SET normal = normal + 1, fake = fake + 1 WHERE guild_id = ? and inviter_id = ?", (invite.guild.id, invite.inviter.id))

                                return
            await db.commit()

我尝试将

cursor.execute("SELECT id, uses FROM invites WHERE guild_id = ?", (member.guild.id))
移至变量中,然后调用该变量,但仍然不起作用。

任何建议或帮助都会有帮助。

sqlite asynchronous discord.py python-asyncio pycord
1个回答
0
投票
# Member Join Event
@commands.Cog.listener()
async def on_member_join(self, member):
    db = await aiosqlite.connect(self.DB)
    try:
        cursor = await db.cursor()
        try:
            invites = await member.guild.invites()

            c = datetime.today().strftime("%Y-%m-%d").split("-")
            c_y = int(c[0])
            c_m = int(c[1])
            c_d = int(c[2])

            await cursor.execute("SELECT id, uses FROM invites WHERE guild_id = ?", (member.guild.id))
            async for invite_id, old_uses in cursor:
                for invite in invites:
                    if invite.id == invite_id and invite.uses - old_uses > 0:
                        if not (c_y == member.created_at.year and c_m == member.created_at.month and c_d - member.created_at.day < 7):
                            print(invite.id)
                            await cursor.execute("UPDATE invites SET uses = uses + 1 WHERE guild_id = ? AND id = ?", (invite.guild.id, invite.id))
                            await cursor.execute("INSERT OR IGNORE INTO joined (guild_id, inviter_id, joiner_id) VALUES (?,?,?)", (invite.guild.id, invite.inviter.id, member.id))
                            await cursor.execute("UPDATE totals SET normal = normal + 1 WHERE guild_id = ? AND inviter_id = ?", (invite.guild.id, invite.inviter.id))

                        else:
                            await cursor.execute("UPDATE totals SET normal = normal + 1, fake = fake + 1 WHERE guild_id = ? and inviter_id = ?", (invite.guild.id, invite.inviter.id))

                        return
        finally:
            await cursor.close()
    finally:
        await db.close()
    await db.commit()

问题似乎出在“with”不被支持,类似的事情发生在我身上,我最后用finally替换了它,这段代码无论发生什么都会关闭连接(记住finally是RIAA),另外你可以放置一个带有回滚的 except。

© www.soinside.com 2019 - 2024. All rights reserved.