You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:50:09