如果相关,我将Django与Django Rest框架、django-mssql-backend和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
)如果有人能解释为何这两种运作模式会有本质上的分别,我很乐意找出答案。
发布于 2021-03-19 22:17:23
我猜你现在已经弄明白了(参见docs):
MyModel.objects.raw('select * from dbo.f_mytablefunction(%s)', [1])如果您希望将表值函数映射到模型,this gist有一种非常全面的方法,但没有提到许可证。
一旦您将模型的‘TableFunctionManager’指向新的对象并添加了'function_args‘OrderedDict (参见gist中的测试),您就可以按如下方式查询它:
MyModel.objects.all().table_function(param1=1)如果有人想知道表值函数的用例,可以尝试搜索“your_db_vendor tvf”。
https://stackoverflow.com/questions/64030810
复制相似问题