Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

网页重复订阅导致user表出现重复数据,无法删除订阅 #694

Open
2 tasks done
xingzhiyou opened this issue Feb 22, 2025 · 2 comments
Open
2 tasks done
Labels
bug Something isn't working

Comments

@xingzhiyou
Copy link

xingzhiyou commented Feb 22, 2025

nonebot-bison 版本

No response

nonebot 版本

No response

安装方式

通过 nb-cli 安装

操作系统

No response

问题

网页端在第一次添加“明日方舟游戏信息”后,添加b站源后,再次添加“明日方舟游戏信息”,会导致第一次添加的“明日方舟游戏信息”无法删除
在聊天交互中添加无问题

data.db.json

日志

确认

  • 我搜索过了 issue,但是并没有发现过与我类似的问题
  • 我确认在日志中去掉了敏感信息
@AzideCupric AzideCupric added the bug Something isn't working label Feb 22, 2025
@AzideCupric AzideCupric changed the title 这个网页订阅导致user表出现两个数据的 网页重复订阅导致user表出现重复数据,无法删除订阅 Feb 22, 2025
@AzideCupric
Copy link
Collaborator

三个表的数据为

subscribe

id target_id user_id categories tags
2 1 2 [3] []
3 2 1 [1, 2, 3, 4, 5, 6] []

user

id default_schedule_weight platform_name target target_name
1 10 arknights default 明日方舟游戏信息
2 10 bilibili 688411531 逻辑元LogicalByte
3 10 ceobecanteen 7d23708b-e424-418b-b4c4-43c370c3b6d0 明日方舟-B站

target

id user_target
1 {"platform_type": "QQ Group", "group_id": 539600566}
2 {"platform_type": "QQ Group", "group_id": 539600566}

推断

删除订阅的代码为

async def del_subscribe(self, user: PlatformTarget, target: str, platform_name: str):
async with create_session() as session:
user_obj = await session.scalar(select(User).where(User.user_target == model_dump(user)))
target_obj = await session.scalar(
select(Target).where(Target.platform_name == platform_name, Target.target == target)
)
await session.execute(delete(Subscribe).where(Subscribe.user == user_obj, Subscribe.target == target_obj))
target_count = await session.scalar(
select(func.count()).select_from(Subscribe).where(Subscribe.target == target_obj)
)
if target_count == 0:
# delete empty target
await asyncio.gather(*[hook(platform_name, T_Target(target)) for hook in self.delete_target_hook])
await session.commit()

user_obj: User | None = await session.scalar(select(User).where(User.user_target == model_dump(user)))
user_obj推断查询到了查到id=1的记录
而明日方舟的target_id为1,
那么delete(Subscribe).where(Subscribe.user == user_obj, Subscribe.target == target_obj)将删除subscribe表中
target_id=1user_id=1的记录,显然这样的记录并不存在,因此删除出现错误

该bug由管理页面可以添加相同的user所引发

修复

需要修改的部分应该有

  • 管理页面调用api时的重复数据检查
  • del_subcribe 执行删除操作时,应检查删除语句的执行情况

@AzideCupric
Copy link
Collaborator

是在外面的card点击添加会触发,但是非常神秘bug,让我无法复现

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants