我正在使用SQL Alchemy的ORM,当我返回单个列时,我发现我得到的结果如下:
[(result,), (result_2,)] # etc...
Run Code Online (Sandbox Code Playgroud)
有了这样的一套,我发现我必须经常这样做:
results = [r[0] for r in results] # So that I just have a list of result values
Run Code Online (Sandbox Code Playgroud)
这不是"坏",因为我的结果集通常很小,但如果不是这样,可能会增加很多开销.最重要的是我觉得它使源变得混乱,错过这一步是我遇到的一个非常常见的错误.
有没有办法避免这个额外的步骤?
一个相关的旁白:在ORM的这种行为似乎在这种情况下不方便,但在我的结果集是另一种情况,[(ID,值)]它最终是这样的:
[(result_1_id, result_1_val), (result_2_id, result_2_val)]
Run Code Online (Sandbox Code Playgroud)
然后我可以这样做:
results = dict(results) # so I have a map of id to value
Run Code Online (Sandbox Code Playgroud)
这个有一个优点,在返回结果后作为一个有用的步骤.
这真的是一个问题,还是我只是一个挑剔的事情,获得结果集后的后期处理对两种情况都有意义?我确信我们可以考虑其他一些常见的后处理操作,以使结果集在应用程序代码中更加可用.是否有全面的高性能和方便的解决方案,或者后处理是不可避免的,仅仅需要不同的应用程序使用?
当我的应用程序实际上可以由SQL炼金术的ORM返回的对象的优势似乎非常有帮助,但在情况下,我不能或不会,没有这么多.这一般只是ORM的常见问题吗?在这样的情况下,我最好不要使用ORM层吗?
我想我应该展示一下我正在谈论的实际orm查询的一个例子:
session.query(OrmObj.column_name).all()
Run Code Online (Sandbox Code Playgroud)
要么
session.query(OrmObj.id_column_name, OrmObj.value_column_name).all()
Run Code Online (Sandbox Code Playgroud)
当然,在真正的查询中通常会有一些过滤器等.
我正在查询模型的ID,并获取(int,)元组列表而不是id列表.有没有办法直接查询属性?
result = session.query(MyModel.id).all()
Run Code Online (Sandbox Code Playgroud)
我意识到这是可能的
results = [r for (r,) in results]
Run Code Online (Sandbox Code Playgroud)
查询是否可以直接返回该表单,而不必自己处理它?
在处理我的Python项目(我的第一个应用程序)时,我在对数据库运行查询时遇到了一个问题:我得到一个包含单个值的元组列表,如:[(value1,),(value2, )]所涉及的表具有多对多关系,ORM是SQLAlchemy.
我的解决方案是使用foreach循环:
def get_user_roles(user_id):
the_roles = db.session.query(Role.role).filter(Role.users.any(id=user_id)).all()
response = []
length = len(the_roles)
for key in range(length):
the_roles[key] = list(the_roles[key])
response.append(the_roles[key][0])
return response
Run Code Online (Sandbox Code Playgroud)
为了更好地理解,您可以在这里查看:https: //github.com/Deviad/adhesive/blob/master/theroot/users_bundle/helpers/users_and_roles.py
我正在寻找一种更好的方法,因为我知道foreach循环非常耗时.
谢谢.