我使用的是SQL Alchemy的ORM,发现返回单列时,结果如下:
[(result,), (result_2,)] # etc...
使用这样的集合,我发现我必须经常这样做:
results = [r[0] for r in results] # So that I just have a list of result values
这并不是那么“糟糕”,因为我的结果集通常很小,但是如果不是这样,则可能会增加大量开销。最大的事情是我感到源代码混乱,而错过此步骤是我遇到的一个非常常见的错误。
有什么办法可以避免这个额外的步骤?
除了一个相关的问题:在这种情况下,orm的这种行为似乎很不方便,但是在另一种情况下,我的结果集是[[id,value)],它最终像这样结束:
[(result_1_id, result_1_val), (result_2_id, result_2_val)]
然后,我可以这样做:
results = dict(results) # so I have a map of id to value
这具有返回结果后有意义的有用步骤的优点。
这真的是问题吗,还是我只是一个小问题,得到结果集后的后处理在两种情况下都有意义?我确定我们可以想到其他一些常见的后处理操作,以使结果集在应用程序代码中更可用。是否有一个全面的高性能和便捷的解决方案,或者后处理是不可避免的,而仅仅是不同应用程序使用所必需的?
当我的应用程序实际上可以利用SQL Alchemy的ORM返回的对象时,它似乎非常有帮助,但是在我不能或不可以的情况下,它就没有那么多了。这仅仅是ORM的普遍问题吗?在这种情况下,我最好不要使用ORM层吗?
我想我应该显示一个我正在谈论的实际orm查询的示例:
session.query(OrmObj.column_name).all()
要么
session.query(OrmObj.id_column_name, OrmObj.value_column_name).all()
当然,在实际查询中,通常会有一些过滤器等。