如Django文档中所述,我们可以使用cursor.callproc('find_all')
之类的光标对象来执行存储过程。
我也知道我们也可以通过model.object.raw("call SPName")
我想知道这两种方法中哪一种在性能,可读性,防止诸如sql注入之类的攻击以及针对给定解决方案的说明方面更好。
答案 0 :(得分:1)
根据docs,model.objects.raw()
方法适用于运行返回模型实例的查询。请从文档中查看以下示例:
>>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
... print(p)
John Smith
Jane Jones
因此,如果要将存储过程的结果转换为某些模型的实例,则可能应使用raw()
。否则,您应该使用游标对象,因为raw()
会做不必要的工作来将结果转换为Django模型实例。
谈到您的其他问题: