当我们需要的查询是简单的select
或insert
条款时,ORM工具非常棒。
但有时我们可能不得不退回使用原始SQL查询,因为我们可能需要使查询变得如此复杂以至于只使用ORM API无法为我们提供高效且有效的解决方案。
如何处理从原始查询和 orm查询返回的对象之间的差异?
答案 0 :(得分:2)
我个人努力设计我的模型,因此我不必为编写原始SQL查询或在ContentTypes
框架中混合使用复杂关系,因此我没有相关主题的经验。 / p>
该文档涵盖了performing raw SQL queries的API主题。您可以使用模型上的Manager.raw()
(MyModel.objects.raw()
),查询可以将列映射回实际模型字段的查询,也可以使用用户cursor
查询数据库连接上的原始行。
如果您要使用Manager.raw()
,则可以使用RawQuerySet
代替通常的QuerySet
。对于所有相关的事情,在使用结果对象时,两个模拟容器的方式相同,但QuerySet
是一个功能更多的monad。
我可以想象在Django中执行原始SQL查询比使用没有ORM支持的框架更有价值 - Django可以管理您的数据库模式并为您提供数据库连接,您只需手动创建查询和位置查询参数。生成的行可以作为列表或词典进行访问,这两个行都适合在模板中显示或执行其他提升。
答案 1 :(得分:1)
SQLAlchemy在制定queries时允许相当复杂,因此您通常可以在没有原始sql的情况下逃脱。如果您确实需要深入了解原始sql,可以使用connection.execute
。但是有一些助手,比如text
和select
functions,可以让您在编程时更轻松。至于处理返回的对象,您将获得一个易于以pythonic方式处理的元组列表。
通常,如果需要将行(元组列表等)视为ORM返回的内容,一种方法是编写一个模拟查询集接口的适配器类。这可以使用返回的元组的“模式”进行初始化,然后迭代并返回具有属性而不是元组的对象。我并不是真的需要这个,但是我可以看到它是如何有用的,例如,如果你有一个依赖于传递查询集的框架。