سؤال

ولقد حصلت على مصدر البيانات الذي يقدم قائمة من الأشياء وخصائصها (ملف CSV، ولكن هذا لا يهم). في كل مرة يتم تشغيل برنامجي، فإنه يحتاج إلى سحب نسخة جديدة من قائمة الكائنات، قارنه إلى قائمة الكائنات (وممتلكاتهم) المخزنة في قاعدة البيانات، وتحديث قاعدة البيانات حسب الحاجة.

والتعامل مع الأشياء الجديدة من السهل - مصدر البيانات يعطي كل كائن على رقم متسلسل، والتحقق من رقم كبير في معلومات جديدة ضد قاعدة البيانات، والانتهاء من ذلك. أنا أبحث عن اقتراحات لحالات أخرى - عند بعض من خصائص الكائن قد تغيرت، أو عندما تم حذف كائن

والحل سيكون من السذاجة لسحب جميع الكائنات من قاعدة البيانات والحصول على تكملة تقاطع مجموعتين (القديمة والجديدة) ثم فحص تلك النتائج، ولكن الذي يبدو أنه لن تكون فعالة جدا إذا مجموعات الحصول الكبيرة. أي أفكار؟

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

المحلول

ونهج موحد لأكوام ضخمة من كميات البيانات لهذا.

ونحن سوف نفترض أن list_1 هو "سيد" (بدون تكرار) وlist_2 هو "التحديثات" التي قد يكون لها التكرارات.

iter_1 = iter( sorted(list_1) ) # Essentially SELECT...ORDER BY
iter_2 = iter( sorted(list_2) )
eof_1 = False
eof_2 = False
try:
    item_1 = iter_1.next()
except StopIteration:
    eof_1= True
try:
    item_2 = iter_2.next()
except StopIteration:
    eof_2= True
while not eof_1 and not eof_2:
    if item_1 == item_2:
        # do your update to create the new master list.
        try:
            item_2 = iter_2.next()
        except StopIteration:
            eof_2= True
    elif item_1 < item_2:
        try:
            item_1 = iter_1.next()
        except StopIteration:
            eof_1= True
    elif item_2 < item_1:
        # Do your insert to create the new master list.
        try:
            item_2 = iter_2.next()
        except StopIteration:
            eof_2= True
assert eof_1 or eof_2
if eof_1:
    # item_2 and the rest of list_2 are inserts.
elif eof_2:
    pass
else:
    raise Error("What!?!?") 

نعم، أنه ينطوي على نوع المحتملين. إذا بقيت list_1 من أجل فرزها عند كتابة مرة أخرى إلى نظام الملفات، الذي يحفظ قدرا كبيرا من الوقت. إذا كان من الممكن المتراكمة list_2 في بنية أن يحفظه فرزها، ثم أن يوفر قدرا كبيرا من الوقت.

وعذرا عن إطناب، ولكن عليك أن تعرف ما هي مكرر رفع StopIteration، لذلك لا يمكنك (مسلي) التفاف كله بينما حلقة في كتلة المحاولة كبير القديمة.

نصائح أخرى

هل هناك أي وسيلة للحفاظ على "آخر مرة المعدلة" المجال؟ هذا ما يبدو وكأنه كنت حقا تبحث عن: نسخ احتياطي تزايدي، بناء على آخر نسخة احتياطية مرة تم تشغيل، مقارنة مع آخر مرة تم تغيير كائن / حذف (/ المضافة)

وتحتاج إلى أن يكون الطوابع الزمنية في كل من قاعدة البيانات وملف CSV الخاص بك. الطابع الزمني ينبغي أن تظهر البيانات عندما تم تحديث السجل ويجب مقارنة الطوابع الزمنية من السجل مع نفس معرفات لتقرر ما إذا كنت تحتاج إلى تحديث أو لا

وأما بالنسبة لفكرتك عن تقاطع ... يجب أن يتم ذلك بالعكس بالعكس! لديك لاستيراد كافة البيانات من CSV إلى الجدول المؤقت والقيام التقاطع بين جداول قاعدة البيانات SQL 2. إذا كنت تستخدم أوراكل أو MS SQL 2008 (لست متأكدا لعام 2005) وجدت لكم الكلمة MERGE مفيدة جدا، لذلك يمكنك كتابة SQL مع أقل جهود فإنك سوف تنفق لدمج البيانات في لغة برمجة أخرى.

وعند سحب القائمة إلى البرنامج، أعاد على قائمة القيام استعلام يستند إلى خاصية عمود في جدول قاعدة البيانات التي تعين لنفس خاصية الكائن من قائمة مثل ObjectName. أو هل يمكن تحميل الجدول بأكمله في قائمة ومقارنة قائمة بهذه الطريقة. أنا على افتراض أن لديك شيء فريد من نوعه حول كائن موجود إلى جانب ID بتعيين قاعدة البيانات.

إذا لم يتم العثور على هذا الكائن في الجدول عن طريق الاستعلام، إنشاء إدخال جديد. إذا وجدت مثل المذكورة FogleBird، لديها التجزئة المحسوبة أو CRC المخزنة لذلك الكائن في الجدول الذي يمكنك مقارنة مع الكائن في القائمة (تشغيل حساب على الكائن). إذا كانت التجزئة لا تتطابق، وتحديث هذا الكائن مع واحد على القائمة.

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