如果相关的话,我将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"。