假设您有一个简单的SQLAlchemy映射对象,如下所示:
class User(Base):
__tablename__ = 'users'
id = sqlalchemy.Column(sqlalchemy.Integer, autoincrement=True,primary_key=True)
name = sqlalchemy.Column(sqlalchemy.Unicode(255), unique=True, nullable=False)
email = sqlalchemy.Column(sqlalchemy.Unicode(255), nullable=False)
address = sqlalchemy.Column(sqlalchemy.Unicode(255), nullable=False)
创建用户:
sess.add(User(name=u'One', email=u'one@example.com', address='An address'))
sess.add(User(name=u'Two', email=u'two@example.com', address='An address'))
sess.add(User(name=u'Three', email=u'three@example.com', address='An address'))
您可以使用以下方式查询这三个用户:
1)
sess.query(User).all()
[<__main__.User object at 0x2fb9790>, <__main__.User object at 0x2fb9810>, <__main__.User object at 0x2fb9890>]
它为您提供了用户对象列表。
2)。
sess.query(User.id, User.name, User.email, User.address).all()
[(1, u'one@example.com', u'An address'), (2, u'two@example.com', u'An address'), (3, u'three@example.com', u'An address')]
它为您提供了KeyedTuple对象列表,您可以按属性名称引用字段,如sess.query(User.id,User.name,User.email,User.address).all()[0] .name < / p>
3。)
sess.execute(sess.query(User)).fetchall()
[(1, u'One', u'one@example.com', u'An address'), (2, u'Two', u'two@example.com', u'An address'), (3, u'Three', u'three@example.com', u'An address')]
它为您提供了一个RowProxy对象列表,您可以在其中引用sess.execute(sess.query(User))等字段.tetschall()[0] [&#39; users_name&#39;]。
我的问题是,如果有一种简单的方法来获取第二个查询示例的结果,而不必列出用户类的所有属性,或者是否有办法用键来获取第三个查询的结果&#39;名称&#39;而不是&#39; users_name&#39;,因此与User类中的属性名称相同。
基本上我需要的是一个包含User类的所有列属性的对象,属性可以像res.name或res [&#39; name&#39;]一样引用。 所以我只需要属性,但不需要整个User对象和其他所有东西。
这会使迭代非常容易,因为你可以说例如res.keys()。
我希望我的问题很明确。 我发现这与用户实例非常相似,但仍然不一样。
首选解决方案是KeyedTuple,因此无需明确列出属性。
提前致谢。
答案 0 :(得分:4)
我不确定您的目标是什么,但您是否尝试处理动态列数据?可能存在其他方式,但您始终可以将表列解压缩为查询参数,如下所示:
>>> user_columns = User.__table__.columns
>>> sess.query(*user_columns).all() # unpack user_columns into arguments
[(1, u'One', u'one@example.com', u'An address'), (2, u'Two', u'two@example.com', u'An address'), (3, u'Three', u'three@example.com', u'An address')]