Aiogram 3+SQLAlchemy查询用户名称返回内存地址的解决方法
问题修复方案:从SQLAlchemy查询中获取用户名称
问题根源
你直接返回了session.execute()的结果对象(ChunkedIteratorResult),而非从中提取实际的name字段值,导致机器人输出了对象的内存地址而非名称。
修复后的orm_get_name函数
以下两种写法均可正确提取名称,推荐第一种更简洁的方式:
方法1:使用scalar()(推荐)
scalar()专门用于获取单个查询结果,无匹配数据时返回None:
async def orm_get_name(session: AsyncSession, tg_id: int) -> str | None: query = select(User.name).where(User.tg_id == tg_id) return await session.scalar(query)
方法2:使用scalars().first()
从结果对象中提取标量值列表,并取第一个元素:
async def orm_get_name(session: AsyncSession, tg_id: int) -> str | None: query = select(User.name).where(User.tg_id == tg_id) result = await session.execute(query) return result.scalars().first()
额外优化:处理名称不存在的情况
避免出现Hello None!的尴尬输出,可在start_handler中添加判断:
@user_private_router.message(StateFilter(None), CommandStart()) async def start_handler(message: types.Message, session: AsyncSession, state: FSMContext): if await set_user(session, message.from_user.id): user_name = await orm_get_name(session, message.from_user.id) greetings = f"Hello {user_name}!" if user_name else "Hello there!" await message.answer(greetings, reply_markup=reply.start_kb) else: # 你的其他逻辑 pass
从你的执行日志可以看到,SQL查询已经正确执行(SELECT users.name FROM users WHERE users.tg_id = ?),说明查询语句本身没问题,仅需修正结果提取逻辑即可。
内容的提问来源于stack exchange,提问作者nazkaki
相关产品推荐
相关产品推荐

