在Django中使用对象管理器或游标对象调用存储过程原始SQL查询哪个更好?

时间:2018-09-07 05:40:55

标签: python django

如Django文档中所述,我们可以使用cursor.callproc('find_all')之类的光标对象来执行存储过程。

我也知道我们也可以通过model.object.raw("call SPName")

方法在Django中调用存储过程

我想知道这两种方法中哪一种在性能,可读性,防止诸如sql注入之类的攻击以及针对给定解决方案的说明方面更好。

1 个答案:

答案 0 :(得分:1)

根据docsmodel.objects.raw()方法适用于运行返回模型实例的查询。请从文档中查看以下示例:

>>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
...     print(p)
John Smith
Jane Jones

因此,如果要将存储过程的结果转换为某些模型的实例,则可能应使用raw()。否则,您应该使用游标对象,因为raw()会做不必要的工作来将结果转换为Django模型实例。

谈到您的其他问题:

  • 可读性:与上面相同,这取决于您的过程是否返回数据以填充模型实例;
  • 免受攻击:这两个选项之间没有区别,因为它们都允许参数插值,这是注入安全的。