我有一个User
模型,用户可以使用相同的名称。我想获取具有给定名称的所有用户的电子邮件地址。但是,我必须对查询结果执行result[0].email
才能获得一行的电子邮件。我可以使用for循环执行此操作,但有没有办法只获取一个字段的列表而不必每次都这样做?
my_result = db.session.query(my_table).filter_by(name=name)
emails = []
for r in my_result:
emails.append(r.email)
答案 0 :(得分:15)
不,SQLAlchemy查询返回一个dicts列表的事实并没有真正解决方法。如果您需要一组特定字段,则只能查询这些字段,但如果需要一个字段列表,则必须从结果中提取该字段。以下示例获取具有给定名称的用户的唯一电子邮件列表。
emails = [r.email for r in db.session.query(my_table.c.email).filter_by(name=name).distinct()]
答案 1 :(得分:2)
有一种方法可以使用filter_by
方法从values
查询中返回特定的列。如下:
emails = [r[0] for r in db.session.query(my_table).filter_by(name=name).values('email')]
或:
emails = [r[0] for r in User.query.filter_by(name=name).values('email')]
values()
使用任意数量的字段名称作为参数,并返回一个生成器,该生成器具有元组,每个元组中的每个值都具有元组。然后,使用列表推导获取元组emails
的第一项,将是纯字符串电子邮件地址列表。
答案 2 :(得分:0)
为了保持记录,我喜欢在我的常用lib中使用此功能的包装器:
def flat_list(l):
return ["%s" % v for v in l]
然后:
flat_list(db.session.query(Model.column_attribute).all())