refactor(db): 修复异步连接池无界增长,并完成 SQLAlchemy 2.0 迁移与分层归位 (#6320)

This commit is contained in:
Aqr-K
2026-08-15 06:58:38 +08:00
committed by GitHub
parent e28de9cfe1
commit 8a11214a43
252 changed files with 11405 additions and 2889 deletions
+24 -20
View File
@@ -1,6 +1,7 @@
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, select, ForeignKey
from typing import Optional
from sqlalchemy import Integer, String, Boolean, DateTime, Text, select, ForeignKey
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import Session
from sqlalchemy.orm import Mapped, Session, mapped_column
from datetime import datetime
from app.db import Base, db_query, db_update, async_db_query, async_db_update, get_id_column
@@ -13,31 +14,33 @@ class PassKey(Base):
# ID
id = get_id_column()
# 用户ID
user_id = Column(Integer, ForeignKey('user.id'), nullable=False, index=True)
user_id: Mapped[int] = mapped_column(Integer, ForeignKey('user.id'), nullable=False, index=True)
# 凭证ID (credential_id)
credential_id = Column(String, nullable=False, unique=True, index=True)
credential_id: Mapped[str] = mapped_column(String, nullable=False, unique=True, index=True)
# 凭证公钥
public_key = Column(Text, nullable=False)
public_key: Mapped[str] = mapped_column(Text, nullable=False)
# 签名计数器
sign_count = Column(Integer, default=0)
sign_count: Mapped[Optional[int]] = mapped_column(Integer, default=0)
# 凭证名称(用户自定义)
name = Column(String, default="通行密钥")
name: Mapped[Optional[str]] = mapped_column(String, default="通行密钥")
# AAGUID (Authenticator Attestation GUID)
aaguid = Column(String, nullable=True)
aaguid: Mapped[Optional[str]] = mapped_column(String, nullable=True)
# 创建时间
created_at = Column(DateTime, default=datetime.now)
created_at: Mapped[Optional[datetime]] = mapped_column(DateTime, default=datetime.now)
# 最后使用时间
last_used_at = Column(DateTime, nullable=True)
last_used_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
# 是否启用
is_active = Column(Boolean, default=True)
is_active: Mapped[Optional[bool]] = mapped_column(Boolean, default=True)
# 传输方式 (usb, nfc, ble, internal)
transports = Column(String, nullable=True)
transports: Mapped[Optional[str]] = mapped_column(String, nullable=True)
@classmethod
@db_query
def get_by_user_id(cls, db: Session, user_id: int):
"""获取用户的所有PassKey"""
return db.query(cls).filter(cls.user_id == user_id, cls.is_active.is_(True)).all()
return list(db.execute(
select(cls).where(cls.user_id == user_id, cls.is_active.is_(True))
).scalars().all())
@classmethod
@async_db_query
@@ -46,13 +49,15 @@ class PassKey(Base):
result = await db.execute(
select(cls).filter(cls.user_id == user_id, cls.is_active.is_(True))
)
return result.scalars().all()
return list(result.scalars().all())
@classmethod
@db_query
def get_by_credential_id(cls, db: Session, credential_id: str):
"""根据凭证ID获取PassKey"""
return db.query(cls).filter(cls.credential_id == credential_id, cls.is_active.is_(True)).first()
return db.execute(
select(cls).where(cls.credential_id == credential_id, cls.is_active.is_(True))
).scalars().first()
@classmethod
@async_db_query
@@ -67,7 +72,7 @@ class PassKey(Base):
@db_query
def get_by_id(cls, db: Session, passkey_id: int):
"""根据ID获取PassKey"""
return db.query(cls).filter(cls.id == passkey_id).first()
return db.execute(select(cls).where(cls.id == passkey_id)).scalars().first()
@classmethod
@async_db_query
@@ -82,10 +87,9 @@ class PassKey(Base):
@db_update
def delete_by_id(cls, db: Session, passkey_id: int, user_id: int):
"""删除指定用户的PassKey"""
passkey = db.query(cls).filter(
cls.id == passkey_id,
cls.user_id == user_id
).first()
passkey = db.execute(
select(cls).where(cls.id == passkey_id, cls.user_id == user_id)
).scalars().first()
if passkey:
passkey.delete(db, passkey.id)
return True