当前位置: 首页 > 面试题库 >

在Django的ORM中访问存储过程的最佳方法是什么

洪和风
2023-03-14
问题内容

我正在设计一个相当复杂的数据库,并且知道我的某些查询将远远超出Django
ORM的范围。有没有人成功地将SP与Django的ORM集成在一起?如果是这样,什么是RDBMS,您是如何做到的?


问题答案:

我们(musicpictures.com/eviscape.com)写下了django代码段,但并不是全部内容(实际上,该代码当时仅在Oracle上进行了测试)。

当您要重用经过测试的SP代码时,或者在一个SP调用比对数据库的多次调用要快的情况下-或者在安全性要求对数据库进行适度访问的情况下-
或者在查询非常复杂/多步骤的情况下,存储过程才有意义。我们正在针对Oracle和Postgres数据库使用混合模型/ SP方法。

诀窍是使其易于使用并使其像“
django”一样。我们使用make_instance函数,该函数获取游标的结果并创建从游标填充的模型的实例。这很好,因为游标可能会返回其他字段。然后,您可以像普通的django模型对象一样在代码/模板中使用这些实例。

def make_instance(instance, values):
    '''
    Copied from eviscape.com

    generates an instance for dict data coming from an sp

    expects:
        instance - empty instance of the model to generate
        values -   dictionary from a stored procedure with keys that are named like the
                   model's attributes
    use like:
        evis = InstanceGenerator(Evis(), evis_dict_from_SP)

    >>> make_instance(Evis(), {'evi_id': '007', 'evi_subject': 'J. Bond, Architect'})
    <Evis: J. Bond, Architect>

    '''
    attributes = filter(lambda x: not x.startswith('_'), instance.__dict__.keys())

    for a in attributes:
        try:
            # field names from oracle sp are UPPER CASE
            # we want to put PIC_ID in pic_id etc.
            setattr(instance, a, values[a.upper()])
            del values[a.upper()]
        except:
            pass

    #add any values that are not in the model as well
    for v in values.keys():
        setattr(instance, v, values[v])
        #print 'setting %s to %s' % (v, values[v])

    return instance

#像这样使用它:

pictures = [make_instance(Pictures(), item) for item in picture_dict]

#这是一些帮助函数:

def call_an_sp(self, var):
    cursor = connection.cursor()
    cursor.callproc("fn_sp_name", (var,))
    return self.fn_generic(cursor)


def fn_generic(self, cursor):
    msg = cursor.fetchone()[0]
    cursor.execute('FETCH ALL IN "%s"' % msg)
    thing = create_dict_from_cursor(cursor)
    cursor.close()
    return thing

def create_dict_from_cursor(cursor):
    rows = cursor.fetchall()
    # DEBUG settings (used to) affect what gets returned. 
    if DEBUG:
        desc = [item[0] for item in cursor.cursor.description]
    else:
        desc = [item[0] for item in cursor.description]
    return [dict(zip(desc, item)) for item in rows]


 类似资料:
  • 问题内容: 我这样存储电话号码: 用户将输入电话号码,而我将使用该电话号码。此应用程序将在全球范围内使用。因此,我还需要国家代码。是存储电话号码的好方法吗?而且,我该如何验证电话号码? 问题答案: 你实际上可能会研究国际标准格式E.164,例如Twilio推荐的格式(该服务具有通过REST请求发送SMS或电话的服务和API)。 这可能是最普遍的电话号码存储方式,尤其是在你使用国际号码的情况下。 1

  • 我有一个Android应用程序,我想实现一个功能,用户可以上传SVG,然后将SVG保存在firebase实时数据库中,然后其他用户可以看到它并与之交互,我选择SVG而不是常规照片或PNG的原因是因为它非常小,不会消耗存储或数据来加载, 加上它们具有多种显示密度和不同的屏幕比例更好,问题是我不知道这是否可行,如果它是我不知道它将被保存为的格式是什么,因为我有一个保存SVG路径的想法,但没有找到将其转

  • 我正在使用java servlet编写一个简单的服务器。为了从数据库中获取数据,我编写了一个特殊的Dao层类,我想知道我应该在哪里存储SQL查询? 我需要创建一个特殊的类,将查询存储为最终字符串,还是有更有效的方法来实现?

  • 问题内容: 目前,我的代码中有很多类似于以下内容的python对象: 现在,我想将其转换为Django模型,其中self.myName是字符串字段,而self.myFriends是字符串列表。 由于列表是python中如此常见的数据结构,因此,我希望其中有一个Django模型字段。我知道我可以使用ManyToMany或OneToMany关系,但是我希望避免代码中的额外间接访问。 问题答案: 将这种

  • 我有一个游戏,在MySQL数据库中存储boss在简单模式和硬模式下的杀人记录。有14个老板。我想存储一个球员杀死一个老板的次数和难度。我有几个选择,我可以看到。。 为每个boss以及每个难度在表中创建一个单独的列。例如。 创建两个存储数字序列的字段,这些数字可以稍后提取出来,以便在PHP中进行比较。其中easykills是一个由28个字符组成的字符串,每2个字符就有一个计数器,用于计算boss被杀

  • 问题内容: 基本上,我的问题是- 我有一个价格清单,其中一些是历史价格(即,我希望能够搜索到产品X在3月11日价格为0.99美元,在4月1日价格为1.99美元,等等)。存储此信息的最佳方法是什么? 我以为我可能会有一个产品表,该产品表具有一个价格表的外键。最初,我认为存储当前价格可能是最好的选择,但是我想我希望能够存储历史价格数据,所以最好的方法是存储一个类似于以下价格表的表: 我在这里有点茫然。