SQLAlchemy返回元组而不是字典

Iva*_*van 9 python sqlalchemy

我已经将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)


msw*_*msw 10

你确定它不是一个在打印时假装成元组的ResultProxy吗?ORM中的许多对象不是它们的__str__函数返回的对象.


yar*_*sca 7

这应该工作:( 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)