从查询结果中获取一列的值列表

时间:2015-08-05 20:24:20

标签: python sqlalchemy

我有一个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)

3 个答案:

答案 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())