Django模型基于使用MyModel.objects.raw()的SQL表值函数



如果相关的话,我将Django与Django Rest Framework、Django-mssql后端和pyodbc 一起使用

我正在使用相当复杂的查询和Django的MyModel.objects.raw((功能构建一些遗留数据库的只读模型。最初,我将查询作为Select查询执行,该查询运行良好,但我收到了一个请求,要求尝试执行相同的操作,但使用数据库中的表值函数。

执行此操作:

MyModel.objects.raw(select * from dbo.f_mytablefunction)

给出错误:对象名称"myapp_mymodel"无效。更深入地研究出错时的局部变量,看起来像是生成了以下SQL:

'SELECT [myapp_mymodel].[Field1], '
'[myapp_mymodel].[Field2] FROM '
'[myapp_mymodel] WHERE '
'[myapp_mymodel].[Field1] = %s'

模型本身被正确地映射到执行等价物的查询:

MyModel.objects.raw(select * from dbo.mytable)

按预期返回数据,dbo.f_mytablefunction定义为:

CREATE FUNCTION dbo.f_mytablefunction
(
@param1 = NULL etc etc
)
RETURNS TABLE
AS
RETURN
(
SELECT
field1, field2 etc etc
FROM            
dbo.mytable
)

如果有人能解释为什么这两种操作模式被区别对待,我会很高兴地发现。

我想你现在已经明白了(请参阅文档(:

MyModel.objects.raw('select * from dbo.f_mytablefunction(%s)', [1])

如果您想将表值函数映射到一个模型,尽管没有提到许可证,但这个要点有一个非常彻底的方法。

一旦您将模型"对象"指向新的TableFunctionManager并添加了"function_args"OrderedDict(请参阅要点中的测试(,您就可以如下查询它:

MyModel.objects.all().table_function(param1=1)

如果有人想知道表值函数的用例,请尝试搜索"your_db_vendor tvf"。

最新更新