SQLAlchemy联表查询仅返回单表列的问题排查
问题原因及解决方案
问题出在你使用的scalars().all()方法上——这个方法的作用是提取查询结果的第一列数据,所以不管你在select()中指定了多少字段,它只会返回第一个字段(也就是DBUser.email)的列表,这就是你只拿到邮箱数据的核心原因。
正确的获取方式
方式1:直接获取全量元组结果
把scalars().all()换成执行结果的all()方法,这样会返回包含所有选中字段的元组列表:
query = select(DBUser.email, DBUser.nickname, DBNote.message) .join(DBNote, DBUser.id == DBNote.user_id) .where(DBNote.remind_time < current_time) .limit(high).offset(low) result = (await self._session.execute(query)).all()
返回的result是类似[("user1@example.com", "昵称1", "消息内容1"), ("user2@example.com", "昵称2", "消息内容2")]的结构。
方式2:获取字典形式的结果
如果希望结果是更易读的字典结构,可以使用mappings().all():
result = (await self._session.execute(query)).mappings().all()
返回的result是类似[{"email": "user1@example.com", "nickname": "昵称1", "message": "消息内容1"}, ...]的结构。
额外说明
pgAdmin中的SQL查询会返回所有选中字段的原因是原生SQL本身就会返回全列,但SQLAlchemy的scalars()方法是专门为单列查询场景设计的,和原生SQL工具的行为逻辑不同。你之前尝试的调整字段顺序、使用select_from等操作,都没有改变scalars()只取第一列的本质,所以问题一直存在。
内容的提问来源于stack exchange,提问作者klukashka
相关产品推荐
相关产品推荐

