Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用django.db时,如何将原始SQL与ORMAPI混合使用?_Python_Sql_Orm_Django Models - Fatal编程技术网

Python 在使用django.db时,如何将原始SQL与ORMAPI混合使用?

Python 在使用django.db时,如何将原始SQL与ORMAPI混合使用?,python,sql,orm,django-models,Python,Sql,Orm,Django Models,当我们需要的查询是简单的select或insert子句时,ORM工具非常有用 但有时我们可能不得不回过头来使用原始SQL查询,因为我们可能需要使查询变得如此复杂,以至于仅仅使用ORMAPI无法为我们提供高效的解决方案 如何处理从原始查询返回的对象与orm查询返回的对象之间的差异?我个人努力设计我的模型,这样我就不必编写原始SQL查询,也不必在复杂关系的框架中混用,因此我在这方面没有经验 本文档涵盖了的API主题。您可以在模型(MyModel.objects.raw())上使用Manager.ra

当我们需要的查询是简单的
select
insert
子句时,ORM工具非常有用

但有时我们可能不得不回过头来使用原始SQL查询,因为我们可能需要使查询变得如此复杂,以至于仅仅使用ORMAPI无法为我们提供高效的解决方案


如何处理从原始查询返回的对象与orm查询返回的对象之间的差异?

我个人努力设计我的模型,这样我就不必编写原始SQL查询,也不必在复杂关系的框架中混用,因此我在这方面没有经验

本文档涵盖了的API主题。您可以在模型(
MyModel.objects.raw()
)上使用
Manager.raw()
)进行查询,以便将列映射回实际的模型字段,也可以使用用户
光标
查询数据库连接上的原始行

如果要使用
Manager.raw()
,您将使用
RawQuerySet
而不是通常的
QuerySet
。对于所有相关的事情,当处理结果对象时,两个模拟容器完全相同,但是
QuerySet
是一个功能更加丰富的monad


我可以想象,在Django中执行原始SQL查询比使用不支持ORM的框架更有价值。Django可以管理您的数据库模式并为您提供数据库连接,您只需手动创建查询并定位查询参数。生成的行可以作为列表或字典进行访问,这两者都使其适合在模板中显示或执行额外的提升。

SQLAlchemy允许在制定过程中有相当多的复杂性,因此您通常可以不使用原始sql。如果确实需要深入到原始sql,可以使用
connection.execute
。但是有一些帮助程序,如
文本
选择
,可以使编程更容易。至于处理返回的对象,您会得到一个元组列表,这些元组很容易以python的方式处理


一般来说,如果您需要将行(元组列表等)视为ORM返回的内容,一种方法是编写一个适配器类来模拟queryset接口。这可以用返回元组的“模式”初始化,然后迭代并返回具有属性而不是元组的对象。我并不是真的需要这个,但我可以看到它是多么有用,例如,如果您有一个依赖于传递查询集的框架。

是的,
Manager.raw()
在执行原始SQL查询时非常有帮助。我想知道SQLAlchemy是否也有类似的东西。但元组不是对象,当与ORMAPI返回的对象混合时,我们必须设计至少两组操作来以不同的方式处理它们,是吗?好的,我想我错过了你前面问题的要点,请看更新。但简而言之,答案是肯定的。适配器是处理接口不匹配问题(元组或其他与QuerySet或其他对象不匹配的对象)的最佳方法。