Django调用第二个数据库的存储过程

时间:2015-01-14 15:20:53

标签: mysql django stored-procedures python-3.4 django-orm

我正在尝试在多数据库Django安装上调用存储过程,但是没有任何运气获得结果。存储过程(在辅助数据库上)总是在Django中返回一个空数组,但是在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。

那么......我错过了什么想法?如何使存储过程正常工作?

1 个答案:

答案 0 :(得分:1)

以下是我采取的步骤:

  1. 将我的存储过程转储结果放入临时表中,以便将结果集展平为单个结果集。这摆脱了multi=True
  2. 的需要
  3. 此外,我确保我的IP地址的用户有权访问数据库本身的存储过程。
  4. 最后,我继续研究 callproc 函数。最终,另一个网站上有人建议使用以下代码:

    cur = connections["SomeDB"].cursor()
    cur.callproc("spGetLocationPath", [id, someval])
    res = next(cur.stored_results()).fetchall()
    cur.close()