سؤال

أنا تصميم معقدة إلى حد ما قاعدة بيانات, و نعلم أن بعض الاستفسارات سوف تكون بعيدة خارج نطاق جانغو ORM.وقد أي شخص من أي المتكاملة SP مع جانغو ORM بنجاح ؟ إذا كان الأمر كذلك ، ما RDBMS وكيف فعلت ذلك ؟

هل كانت مفيدة؟

المحلول

ونحن (musicpictures.com / eviscape.com) كتب أن جانغو مقتطفة ولكن ليست القصة كلها (في الواقع هذا الرمز تم اختبار فقط على أوراكل في ذلك الوقت).

والإجراءات المخزنة منطقية عندما تريد إعادة تجربتها واختبارها كود SP أو حيث الدعوة SP أحد سيكون أسرع من مكالمات متعددة إلى قاعدة البيانات - أو حيث يتطلب أمان الوصول أدار إلى قاعدة البيانات - أو حيث الاستعلامات معقدة للغاية / متعددة الخطوات. نحن باستخدام نهج نموذج هجين / SP ضد كل من قواعد بيانات أوراكل وبوستجرس.

وهو خدعة لجعلها سهلة الاستخدام والحفاظ عليه "جانغو" مثل. نحن نستخدم وظيفة make_instance التي تأخذ نتيجة المؤشر ويخلق حالات من نموذج تعبئة من المؤشر. هذا هو لطيف لأن المؤشر قد يعود حقول إضافية. ثم يمكنك استخدام تلك الحالات في التعليمات البرمجية / قوالب مثل الكثير من الأشياء نموذج جانغو العادية.

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]    

وابتهاج، سيمون.

نصائح أخرى

لديك لاستخدام أداة توصيل في جانغو:

from django.db import connection

cursor = connection.cursor()
cursor.execute("SQL STATEMENT CAN BE ANYTHING")

وبعد ذلك يمكنك جلب البيانات:

cursor.fetchone()

وأو:

cursor.fetchall()

ومزيد من المعلومات هنا: http://docs.djangoproject.com/en / ديف / المواضيع / ديسيبل / SQL /

وهناك مثال جيد:   https://djangosnippets.org/snippets/118/

from django.db import connection


cursor = connection.cursor()
ret = cursor.callproc("MY_UTIL.LOG_MESSAGE", (control_in, message_in))# calls PROCEDURE named LOG_MESSAGE which resides in MY_UTIL Package
cursor.close()

إذا كنت تريد أن ننظر إلى الفعلية تشغيل مشروع يستخدم SP, تحقق minibooks.صفقة جيدة من SQL مخصص ويستخدم بوستجرس pl/pgsql ليرة سورية.أعتقد أنهم ذاهبون إلى إزالة ليرة سورية في نهاية المطاف على الرغم من (مبرر تراك تذكرة 92).

لا.

وعلى محمل الجد.

ونقل المنطق الإجراء المخزن إلى النموذج الخاص بك حيث تنتمي.

ووضع بعض التعليمات البرمجية في جانغو وبعض التعليمات البرمجية في قاعدة البيانات هو كابوس الصيانة. قضيت الكثير من بلدي 30+ سنوات في مجال تكنولوجيا المعلومات في محاولة لتنظيف هذا النوع من الفوضى.

واعتقد ان تحسن مزود الخام دعم مجموعة طلبات البحث في جانغو 1.2 يمكن أن تجعل هذا اسهل ما من شأنه أن لا يكون لديك للفة الخاصة كود نوع make_instance الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top