我正在尝试创建邀请经理,但我不断收到此错误
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))
移至变量中,然后调用该变量,但仍然不起作用。
任何建议或帮助都会有帮助。
# 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。