如何将SQLAlchemy查询结果转为列表对象,解决'User'对象不可迭代报错
问题根源
你调用db.session.query(User).first()时,first()方法返回的是单个User类的实例对象,不是可迭代的查询结果集,所以对它执行for row in rows遍历操作就会触发'User' object is not iterable报错。
解决方案
场景1:你确实只需要获取第一条用户数据
不需要循环遍历,直接将单个User对象转为可序列化的结构即可,示例代码如下:
@app.route('/users') def users(): data = [] # first返回单个User实例 user = db.session.query(User).first() # 手动提取需要返回的字段,避免返回密码等敏感信息 if user: data.append({ "id": user.id, "username": user.username, "email": user.email # 按需添加其他需要返回的字段 }) return jsonify(data)
场景2:你需要获取所有用户数据
把first()替换为all(),all()返回的是包含所有符合查询条件的User实例的列表,支持遍历:
@app.route('/users') def users(): data = [] # all返回User实例组成的列表,可正常遍历 users = db.session.query(User).all() for user in users: data.append({ "id": user.id, "username": user.username, "email": user.email # 按需添加其他需要返回的字段 }) return jsonify(data)
额外说明
不要直接用list(row)处理ORM实例,ORM实例不是字段值组成的序列,直接转换会得到错误结果。如果不想手动拼接字段,可以给User模型加一个通用转字典的方法,示例如下:
class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) # 新增通用转字典方法 def to_dict(self): return {c.name: getattr(self, c.name) for c in self.__table__.columns}
之后遍历的时候直接调用方法即可:
data.append(user.to_dict())
内容的提问来源于stack exchange,提问作者Kelvin Jones
相关产品推荐
相关产品推荐

