gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:58:23 25 4
gpt4 key购买 nike

如果相关,我将 Django 与 Django Rest Framework、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
)

如果有人对这两种操作模式的处理方式有很大不同的原因有任何解释,那么我将非常乐意找出答案。

最佳答案

我猜你现在已经想通了(参见 docs ):

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

如果您想将表值函数映射到模型,this gist有一个相当彻底的方法,尽管没有提到许可证。

将模型“对象”指向新的 TableFunctionManager 并添加“function_args”OrderedDict(请参阅要点中的测试)后,您可以按如下方式查询它:

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

对于任何想知道表值函数用例的人,请尝试搜索“your_db_vendor tvf”。

关于sql-server - 使用 MyModel.objects.raw() 基于 SQL 表值函数的 Django 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64030810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com