refactor(database): 将同步数据库操作迁移为异步操作
将整个项目的数据库操作从同步模式迁移为异步模式,主要涉及以下修改: - 将 `with get_db_session()` 改为 `async with get_db_session()` - 将同步的 SQLAlchemy 查询方法改为异步执行 - 更新相关的方法签名,添加 async/await 关键字 - 修复由于异步化导致的并发问题和性能问题 这些修改提高了数据库操作的并发性能,避免了阻塞主线程,提升了系统的整体响应能力。涉及修改的模块包括表情包管理、反提示注入统计、用户封禁管理、记忆系统、消息存储等多个核心组件。 BREAKING CHANGE: 所有涉及数据库操作的方法现在都需要使用异步调用,同步调用将不再工作
This commit is contained in:
@@ -163,7 +163,8 @@ class PersonInfoManager:
|
||||
try:
|
||||
# 在需要时获取会话
|
||||
async with get_db_session() as session:
|
||||
record = (await session.execute(select(PersonInfo).where(PersonInfo.person_name == person_name))).scalar()
|
||||
record = result = await session.execute(select(PersonInfo).where(PersonInfo.person_name == person_name))
|
||||
result.scalar()
|
||||
return record.person_id if record else ""
|
||||
except Exception as e:
|
||||
logger.error(f"根据用户名 {person_name} 获取用户ID时出错 (SQLAlchemy): {e}")
|
||||
@@ -339,7 +340,8 @@ class PersonInfoManager:
|
||||
start_time = time.time()
|
||||
async with get_db_session() as session:
|
||||
try:
|
||||
record = (await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))).scalar()
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))
|
||||
record = result.scalar()
|
||||
query_time = time.time()
|
||||
if record:
|
||||
setattr(record, f_name, val_to_set)
|
||||
@@ -401,7 +403,8 @@ class PersonInfoManager:
|
||||
|
||||
async def _db_has_field_async(p_id: str, f_name: str):
|
||||
async with get_db_session() as session:
|
||||
record = (await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))).scalar()
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))
|
||||
record = result.scalar()
|
||||
return bool(record)
|
||||
|
||||
try:
|
||||
@@ -512,10 +515,9 @@ class PersonInfoManager:
|
||||
|
||||
async def _db_check_name_exists_async(name_to_check):
|
||||
async with get_db_session() as session:
|
||||
return (
|
||||
(await session.execute(select(PersonInfo).where(PersonInfo.person_name == name_to_check))).scalar()
|
||||
is not None
|
||||
)
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_name == name_to_check))
|
||||
record = result.scalar()
|
||||
return record is not None
|
||||
|
||||
if await _db_check_name_exists_async(generated_nickname):
|
||||
is_duplicate = True
|
||||
@@ -556,7 +558,8 @@ class PersonInfoManager:
|
||||
async def _db_delete_async(p_id: str):
|
||||
try:
|
||||
async with get_db_session() as session:
|
||||
record = (await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))).scalar()
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))
|
||||
record = result.scalar()
|
||||
if record:
|
||||
await session.delete(record)
|
||||
await session.commit()
|
||||
@@ -585,7 +588,9 @@ class PersonInfoManager:
|
||||
|
||||
async def _get_record_sync():
|
||||
async with get_db_session() as session:
|
||||
return (await session.execute(select(PersonInfo).where(PersonInfo.person_id == person_id))).scalar()
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_id == person_id))
|
||||
record = result.scalar()
|
||||
return record
|
||||
|
||||
try:
|
||||
record = asyncio.run(_get_record_sync())
|
||||
@@ -624,7 +629,9 @@ class PersonInfoManager:
|
||||
|
||||
async def _db_get_record_async(p_id: str):
|
||||
async with get_db_session() as session:
|
||||
return (await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))).scalar()
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))
|
||||
record = result.scalar()
|
||||
return record
|
||||
|
||||
record = await _db_get_record_async(person_id)
|
||||
|
||||
@@ -700,7 +707,8 @@ class PersonInfoManager:
|
||||
"""原子性的获取或创建操作"""
|
||||
async with get_db_session() as session:
|
||||
# 首先尝试获取现有记录
|
||||
record = (await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))).scalar()
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))
|
||||
record = result.scalar()
|
||||
if record:
|
||||
return record, False # 记录存在,未创建
|
||||
|
||||
@@ -715,9 +723,10 @@ class PersonInfoManager:
|
||||
# 如果创建失败(可能是因为竞态条件),再次尝试获取
|
||||
if "UNIQUE constraint failed" in str(e):
|
||||
logger.debug(f"检测到并发创建用户 {p_id},获取现有记录")
|
||||
record = (await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))).scalar()
|
||||
if record:
|
||||
return record, False # 其他协程已创建,返回现有记录
|
||||
result = await session.execute(select(PersonInfo).where(PersonInfo.person_id == p_id))
|
||||
record = result.scalar()
|
||||
if record:
|
||||
return record, False # 其他协程已创建,返回现有记录
|
||||
# 如果仍然失败,重新抛出异常
|
||||
raise e
|
||||
|
||||
|
||||
Reference in New Issue
Block a user