refactor(database): 将同步数据库操作迁移为异步操作
将整个项目的数据库操作从同步模式迁移为异步模式,主要涉及以下修改: - 将 `with get_db_session()` 改为 `async with get_db_session()` - 将同步的 SQLAlchemy 查询方法改为异步执行 - 更新相关的方法签名,添加 async/await 关键字 - 修复由于异步化导致的并发问题和性能问题 这些修改提高了数据库操作的并发性能,避免了阻塞主线程,提升了系统的整体响应能力。涉及修改的模块包括表情包管理、反提示注入统计、用户封禁管理、记忆系统、消息存储等多个核心组件。 BREAKING CHANGE: 所有涉及数据库操作的方法现在都需要使用异步调用,同步调用将不再工作
This commit is contained in:
@@ -8,6 +8,8 @@
|
||||
import datetime
|
||||
from typing import Dict, Any
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.common.database.sqlalchemy_models import AntiInjectionStats, get_db_session
|
||||
from src.config.config import global_config
|
||||
@@ -27,9 +29,11 @@ class AntiInjectionStatistics:
|
||||
async def get_or_create_stats():
|
||||
"""获取或创建统计记录"""
|
||||
try:
|
||||
with get_db_session() as session:
|
||||
async with get_db_session() as session:
|
||||
# 获取最新的统计记录,如果没有则创建
|
||||
stats = session.query(AntiInjectionStats).order_by(AntiInjectionStats.id.desc()).first()
|
||||
stats = (await session.execute(
|
||||
select(AntiInjectionStats).order_by(AntiInjectionStats.id.desc())
|
||||
)).scalars().first()
|
||||
if not stats:
|
||||
stats = AntiInjectionStats()
|
||||
session.add(stats)
|
||||
@@ -44,8 +48,10 @@ class AntiInjectionStatistics:
|
||||
async def update_stats(**kwargs):
|
||||
"""更新统计数据"""
|
||||
try:
|
||||
with get_db_session() as session:
|
||||
stats = session.query(AntiInjectionStats).order_by(AntiInjectionStats.id.desc()).first()
|
||||
async with get_db_session() as session:
|
||||
stats = (await session.execute(
|
||||
select(AntiInjectionStats).order_by(AntiInjectionStats.id.desc())
|
||||
)).scalars().first()
|
||||
if not stats:
|
||||
stats = AntiInjectionStats()
|
||||
session.add(stats)
|
||||
@@ -53,7 +59,7 @@ class AntiInjectionStatistics:
|
||||
# 更新统计字段
|
||||
for key, value in kwargs.items():
|
||||
if key == "processing_time_delta":
|
||||
# 处理时间累加 - 确保不为None
|
||||
# 处理 时间累加 - 确保不为None
|
||||
if stats.processing_time_total is None:
|
||||
stats.processing_time_total = 0.0
|
||||
stats.processing_time_total += value
|
||||
@@ -138,9 +144,9 @@ class AntiInjectionStatistics:
|
||||
async def reset_stats():
|
||||
"""重置统计信息"""
|
||||
try:
|
||||
with get_db_session() as session:
|
||||
async with get_db_session() as session:
|
||||
# 删除现有统计记录
|
||||
session.query(AntiInjectionStats).delete()
|
||||
await session.execute(select(AntiInjectionStats).delete())
|
||||
await session.commit()
|
||||
logger.info("统计信息已重置")
|
||||
except Exception as e:
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
import datetime
|
||||
from typing import Optional, Tuple
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.common.database.sqlalchemy_models import BanUser, get_db_session
|
||||
from ..types import DetectionResult
|
||||
@@ -37,8 +39,9 @@ class UserBanManager:
|
||||
如果用户被封禁则返回拒绝结果,否则返回None
|
||||
"""
|
||||
try:
|
||||
with get_db_session() as session:
|
||||
ban_record = session.query(BanUser).filter_by(user_id=user_id, platform=platform).first()
|
||||
async with get_db_session() as session:
|
||||
result = await session.execute(select(BanUser).filter_by(user_id=user_id, platform=platform))
|
||||
ban_record = result.scalar_one_or_none()
|
||||
|
||||
if ban_record:
|
||||
# 只有违规次数达到阈值时才算被封禁
|
||||
@@ -70,9 +73,10 @@ class UserBanManager:
|
||||
detection_result: 检测结果
|
||||
"""
|
||||
try:
|
||||
with get_db_session() as session:
|
||||
async with get_db_session() as session:
|
||||
# 查找或创建违规记录
|
||||
ban_record = session.query(BanUser).filter_by(user_id=user_id, platform=platform).first()
|
||||
result = await session.execute(select(BanUser).filter_by(user_id=user_id, platform=platform))
|
||||
ban_record = result.scalar_one_or_none()
|
||||
|
||||
if ban_record:
|
||||
ban_record.violation_num += 1
|
||||
|
||||
Reference in New Issue
Block a user