我已经将SQLAlchemy更新为0.6,但它打破了一切.我注意到它不再返回字典而不是字典了.这是一个示例查询:
query = session.query(User.id, User.username, User.email).filter(and_(User.id == id, User.username == username)).limit(1)
result = session.execute(query).fetchone()
Run Code Online (Sandbox Code Playgroud)
这段代码用于返回0.5中的字典.
我的问题是如何归还字典?
Ant*_*sma 36
session.execute从未返回过dict,它返回一个RowProxy对象,可以像 dict一样使用整数键进行位置查找,使用基于标签的查找字符串键或使用Column对象查找该列的值.这里的问题是,session.execute(query)你没有做到你希望它做的事情.它将Query对象转换为Select语句,执行该语句并直接返回结果.结果集对ORM级别功能一无所知.0.5和0.6之间的变化是ORM使用不同的算法来标记查询中的列,它现在将表名添加到标签之前.因此,当以前row['id']碰巧工作,现在row['users_id']工作.在这两种情况下row[User.__table__.columns['id']]工作.
要执行ORM查询,您应该实际使用.all(),.first()和.one()方法或迭代它或使用数字索引.查询返回名为tuple的对象.如果你想要一个字典,用它的键拉链元组:
row = session.query(User.id, User.username, User.email)\
.filter(and_(User.id == id, User.username == username)).first()
print("id=%s username=%s email=%s" % row) # positional
print(row.id, row.username) # by label
print(dict(zip(row.keys(), row))) # as a dict
Run Code Online (Sandbox Code Playgroud)
这应该工作:(
dict(zip(['id','username','email'],result))或者你可以使用字典理解,如果你在Python 3.x上).
此外,你不需要调用session.execute一个的session.query对象.您将要.one()在其上使用该方法.这也消除了.limit(1)在查询结束时挂断呼叫的需要.
小智 6
我使用以下方法解决了这个问题:
# Get a list os user_ids
data_from_db = session.execute(select(User.id)).all()
# Parsing each Row object to a dict by "_mapping" attribute
return [dict(data._mapping) for data in data_from_db]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18173 次 |
| 最近记录: |