From 6d1fa11813daeece8dce68543b77591dd15381fb Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Sat, 1 Nov 2025 16:30:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20QueryBuilder=E9=A2=84=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=88=97=E9=81=BF=E5=85=8Ddetached=E5=AF=B9=E8=B1=A1lazy=20loa?= =?UTF-8?q?ding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在QueryBuilder.first()和all()中预加载所有列 - 防止在session外访问属性导致greenlet_spawn错误 - 与CRUD层修复保持一致的模式 --- src/common/database/api/query.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/common/database/api/query.py b/src/common/database/api/query.py index 3c5229fd9..e07935646 100644 --- a/src/common/database/api/query.py +++ b/src/common/database/api/query.py @@ -204,6 +204,14 @@ class QueryBuilder(Generic[T]): result = await session.execute(self._stmt) instances = list(result.scalars().all()) + # 预加载所有列以避免detached对象的lazy loading问题 + for instance in instances: + for column in self.model.__table__.columns: + try: + getattr(instance, column.name) + except Exception: + pass + # 写入缓存 if self._use_cache: cache = await get_cache() @@ -232,6 +240,14 @@ class QueryBuilder(Generic[T]): result = await session.execute(self._stmt) instance = result.scalars().first() + # 预加载所有列以避免detached对象的lazy loading问题 + if instance is not None: + for column in self.model.__table__.columns: + try: + getattr(instance, column.name) + except Exception: + pass + # 写入缓存 if instance is not None and self._use_cache: cache = await get_cache()