Django 在第二个数据库上调用存储过程
Django Call Stored Procedure on Second Database
我正在尝试在多数据库 Django 安装上调用存储过程,但没有任何运气获得结果。存储过程(在辅助数据库上)在 Django 中总是 returns 一个空数组,但在 mysql 客户端中执行时确实出现预期结果。
我的view.py文件
从 SomeDBModel 导入模型
来自 django.db 导入连接
def index(request, someid):
#Some related django-style query that works here
loc = getLocationPath(someid, 1)
print(loc)
def getLocationPath(id, someval):
cursor = connection.cursor()
cursor.callproc("SomeDB.spGetLocationPath", [id, someval])
results = cursor.fetchall()
cursor.close()
return results
我也试过:
from SomeDBModel import models
from django.db import connections
def index(request, someid):
#Some related Django-style query that works here
loc = getLocationPath(someid, 1)
print(loc)
def getLocationPath(id, someval):
cursor = connections["SomeDB"].cursor()
cursor.callproc("spGetLocationPath", [id, someval])
results = cursor.fetchall()
cursor.close()
return results
每次打印结果时,我得到:
[]
应检索的数据示例:
{
Path: '/some/path/',
LocalPath: 'S:\Some\local\Path',
Folder: 'SomeFolderName',
Code: 'SomeCode'
}
我还尝试过的一件事是打印 cursor.callproc 的结果。我得到:
(id, someval)
此外,打印 cursor._executed 的结果给出:
b'SELECT @_SomeDB.spGetLocationPath_arg1, @_SomeDB.spGetLocationPath_arg2'
似乎根本没有对我想要 运行 的存储过程的任何引用。作为最后的手段,我什至尝试过这个:
cursor.execute("CALL spGetLocationPath("+str(id)+","+str(someval)+")")
但是我得到一个关于需要 multi=True 的错误,但是把它放在 execute() 函数中似乎并不像某些网站建议的那样工作,我不不知道把它放在 Django 的什么地方。
所以...我错过了什么?我怎样才能让存储过程工作?
这些是我采取的以下步骤:
- 使我的存储过程将结果转储到临时 table 中,以便将结果集展平为单个结果集。这摆脱了
multi=True
的需要
- 此外,我确保使用我的 IP 地址的用户有权调用数据库本身中的存储过程。
最后继续研究callproc函数。最终另一个站点上的某人建议了以下代码,该代码有效:
cur = connections["SomeDB"].cursor()
cur.callproc("spGetLocationPath", [id, someval])
res = next(cur.stored_results()).fetchall()
cur.close()
我正在尝试在多数据库 Django 安装上调用存储过程,但没有任何运气获得结果。存储过程(在辅助数据库上)在 Django 中总是 returns 一个空数组,但在 mysql 客户端中执行时确实出现预期结果。
我的view.py文件 从 SomeDBModel 导入模型 来自 django.db 导入连接
def index(request, someid):
#Some related django-style query that works here
loc = getLocationPath(someid, 1)
print(loc)
def getLocationPath(id, someval):
cursor = connection.cursor()
cursor.callproc("SomeDB.spGetLocationPath", [id, someval])
results = cursor.fetchall()
cursor.close()
return results
我也试过:
from SomeDBModel import models
from django.db import connections
def index(request, someid):
#Some related Django-style query that works here
loc = getLocationPath(someid, 1)
print(loc)
def getLocationPath(id, someval):
cursor = connections["SomeDB"].cursor()
cursor.callproc("spGetLocationPath", [id, someval])
results = cursor.fetchall()
cursor.close()
return results
每次打印结果时,我得到:
[]
应检索的数据示例:
{
Path: '/some/path/',
LocalPath: 'S:\Some\local\Path',
Folder: 'SomeFolderName',
Code: 'SomeCode'
}
我还尝试过的一件事是打印 cursor.callproc 的结果。我得到:
(id, someval)
此外,打印 cursor._executed 的结果给出:
b'SELECT @_SomeDB.spGetLocationPath_arg1, @_SomeDB.spGetLocationPath_arg2'
似乎根本没有对我想要 运行 的存储过程的任何引用。作为最后的手段,我什至尝试过这个:
cursor.execute("CALL spGetLocationPath("+str(id)+","+str(someval)+")")
但是我得到一个关于需要 multi=True 的错误,但是把它放在 execute() 函数中似乎并不像某些网站建议的那样工作,我不不知道把它放在 Django 的什么地方。
所以...我错过了什么?我怎样才能让存储过程工作?
这些是我采取的以下步骤:
- 使我的存储过程将结果转储到临时 table 中,以便将结果集展平为单个结果集。这摆脱了
multi=True
的需要
- 此外,我确保使用我的 IP 地址的用户有权调用数据库本身中的存储过程。
最后继续研究callproc函数。最终另一个站点上的某人建议了以下代码,该代码有效:
cur = connections["SomeDB"].cursor() cur.callproc("spGetLocationPath", [id, someval]) res = next(cur.stored_results()).fetchall() cur.close()