2011-07-29 13 views
16

के लिए django डेटाबेस सिंक्रनाइज़ेशन मेरे पास एक मास्टर django सेवर है जहां डेटा संग्रहीत किया जाता है (mysql डेटाबेस)।ऑफ़लाइन उपयोग

ऑनलाइन: मैं बहुत से उपयोगकर्ताओं को चाहते हैं अपने लैपटॉप (sqlLite डीबी) पर इस डेटाबेस सिंक्रनाइज़ (केवल डेल्टा के प्रतिलिपि बनाई जानी चाहिए) से एक प्रतिलिपि प्राप्त करना

ऑफलाइन (उन मास्टर सर्वर तक पहुँच नहीं है): उपयोगकर्ता अपने स्थानीय डेटाबेस को देख और अपडेट कर सकते हैं।

ऑनलाइन वापस: उपयोगकर्ताओं के लैपटॉप पर संशोधित किया गया है जो मास्टर django सर्वर पर वापस सिंक्रनाइज़ किया गया है।

मुझे लगता है, क्योंकि मेरे पास 2 प्रकार का डेटाबेस है, मुझे django ऑब्जेक्ट स्तर पर सिंक्रनाइज़ करने की आवश्यकता है। क्या कोई डीजेंगो एप्लिकेशन ऐसा कर रहा है? यदि नहीं, तो आप इस तरह की सुविधा कोड कैसे प्राप्त करेंगे?

उत्तर

0

ठीक है, मैं वास्तव में ऐसा करने के लिए एक Django एप्लिकेशन हो, तो पता नहीं है, लेकिन मैं इस तरह आगे बढ़ना होगा:

"offline_update" के लिए एक विधि बनाने के लिए: सर्वर के डेटाबेस के लिए कनेक्शन, आप सभी वस्तुओं का चयन जिसका आईडी स्थानीय डेटाबेस में से मेल खाता है। आप स्थानीय डेटाबेस अद्यतन करते हैं। फिर आप बाकी प्रविष्टियों का चयन करते हैं, और आप उन्हें स्थानीय डेटाबेस

समान दिनचर्या में "online_update" के लिए एक विधि बनाते हैं।

प्रो: लागू करना आसान

कान्स (Objects.all() तुम सब कुछ है, तो आप में हेरफेर और अद्यतन, या सीधे बचाने हो जाता है): दौड़ की स्थिति (क्या 2 उपयोगकर्ताओं एक ही प्रविष्टि को अद्यतन करता है, तो (जरूरी नहीं एक ही समय)? किसने सबसे अद्यतन किया है?)

आप मूल रूप से 2 डेटाबेस अद्यतन रखने के लिए "mysql-svn" का एक प्रकार बनाते हैं।

मैं आपके प्रश्न पर +1 मतदान कर रहा हूं, क्योंकि यह वास्तव में दिलचस्प है। मैंने हमेशा डाटाबेस (mysql के माध्यम से) डंप करके और फिर स्थानीय डेटाबेस में लोड करके काम किया है। django का उपयोग किए बिना।

+0

एक और समस्या है: मुझे लगता है कि वस्तुओं की प्राथमिक कुंजी के साथ काम करना एक अच्छा विचार नहीं है: क्योंकि कई उपयोगकर्ता मास्टर डेटाबेस अपडेट कर सकते हैं जबकि कुछ अन्य उपयोगकर्ता अपना ऑफ़लाइन डेटाबेस अपडेट करते हैं, कोई भी प्राथमिक कुंजी पर भी टकराव कर सकता है उन वस्तुओं के लिए जो समान नहीं हैं। – Eric

+0

हाँ मेरा सिर्फ एक उदाहरण था, मूल रूप से हर रूप में "दौड़ की स्थिति" समस्या है ... –

3

यह पता चला है कि मैं Django में इस तरह की एक प्रणाली चला रहा हूं।

यह एक पूरा उत्तर नहीं है, केवल उत्तर जो समस्या को हल कर रहा है (ज्यादातर) समस्या।

  • प्राथमिक कुंजी के लिए यूयूआईडी का उपयोग। इससे अलग-अलग वस्तुओं के लिए बहुत प्राथमिक कुंजी टक्कर कम हो जाती है।
  • डाटा इंटरचेंज के लिए डीजेगो के सीरियलाइजेशन फ्रेमवर्क का उपयोग करें। केंद्रीय व्यवस्थापक साइट में चेंजलिस्ट में चयनित ऑब्जेक्ट्स को Django- संगत धारावाहिक फ़ाइल में डाउनलोड करने का विकल्प होता है। फिर उपयोगकर्ता ऑफ़लाइन जा सकता है और एक स्थानीय व्यवस्थापक साइट शुरू कर सकता है, और वहां, धारावाहिक फ़ाइल अपलोड करें। ऑफ़लाइन संस्करण समाप्त होने पर, "ऑफ़लाइन" व्यवस्थापक साइट में, उसी प्रक्रिया का उपयोग किया जाता है, ऑब्जेक्ट्स को फ़ाइल में क्रमबद्ध किया जाता है, और केंद्रीय व्यवस्थापक साइट पर अपलोड किया जाता है।
  • क्रमबद्धता ढांचे बहुत उपयोगी हैं, क्योंकि आप वास्तविक (और सहेजे गए) ऑब्जेक्ट प्राप्त कर सकते हैं, फिर इसे सहेजने का निर्णय लेते हैं या नहीं, और सहेजने से पहले कुछ फ़ील्ड को संशोधित करने का निर्णय लेते हैं।

हमने इस सरल प्रणाली के साथ बहुत कम परेशानी में भाग लिया है, सामग्री को उचित रूप से वर्गीकृत करने के बाद भी मदद मिली है और संपादक केवल श्रेणियों के गैर ओवरलैप किए गए सेट को बना/संपादित करते हैं।

मैं कुछ लोगों के साथ इस के साथ बात की, और मुझे कई समाधान का प्रस्ताव किया है:

  • एक टाइमस्टैम्प फ़ील्ड का उपयोग करें: यह मदद कौन सा संस्करण को बचाने के लिए और एक त्यागने का फैसला।
  • महापौर और मामूली संस्करण संख्याओं के साथ संस्करण फ़ील्ड का उपयोग करें। मामूली संपादन (वर्तनी सुधार की तरह) केवल मामूली संस्करण संख्या को अद्यतन करता है, और बड़े बदलाव महापौर संस्करण संख्या को अद्यतन करते हैं और नाबालिग को 0 पर सेट करते हैं। इस तरह जब आप तुलना करते हैं तो हमेशा यह पता चलता है कि कौन सा उच्च प्राथमिकता प्राप्त करता है। हालांकि इसे संपादन उपयोगकर्ताओं के भीतर शिक्षा और सम्मेलनों की आवश्यकता है।
  • ऑब्जेक्ट अपडेट। एक अलग मॉडल, जो ऑफ़लाइन संपादन से आने वाले अपडेट संग्रहीत करता है। फिर एक 'मुख्य' संपादक उन्हें वास्तविक वस्तु में विलीन कर देता है, अंतर देखने के लिए कुछ अतिरिक्त व्यवस्थापक दृश्यों में सहायता करता है (Google-diff-match-patch और इसी तरह का उपयोग करके)। प्रत्यक्ष ऑब्जेक्ट्स को अनुमति देने के लिए किसी ऑब्जेक्ट को भी फ़्लैग किया जा सकता है, यानी, कोई संग्रह अपडेट नहीं होता है और उन्हें सीधे आगमन पर लागू किया जाता है। असुविधा 'मुख्य' संपादक को सभी अपडेट की समीक्षा करनी है, और यह इस बात पर निर्भर करता है कि कितनी जानकारी अपडेट की जाती है।

उम्मीद है कि यह किसी भी तरह से मदद करता है। अगर कोई इस बात को लागू करने का फैसला करता है, तो मुझे उससे सुनना अच्छा लगेगा।

+0

हाँ मैं यूयूआईडी के सिद्धांत से सहमत हूं: यह कई कंप्यूटरों पर एक ही आईडी को प्राप्त करने का एकमात्र तरीका है। लेकिन मुझे कुछ और स्वचालित करने की ज़रूरत है ... मुझे इसके बारे में और अधिक सोचना होगा ... – Eric

+0

यूयूआईडी के लिए +1 - जो कि प्रथम श्रेणी के डीबी प्रकार हैं, यदि आप PostgreSQL को अपने आरडीबीएमएस के रूप में उपयोग कर रहे हैं। मैं एक प्रशंसक हूं। – fish2000

1

मैंने एक Django ऐप बनाया जो यह करता है। जब ऐप के रिमोट/लैपटॉप संस्करण पर मॉडल इंस्टेंस बनाए जाते हैं तो उन्हें गंदे के रूप में चिह्नित किया जाता है और एक अस्थायी आईडी प्राप्त होती है। रिमोट ऐप मास्टर सर्वर से कनेक्टिविटी के लिए नियमित रूप से जांचता है। जब कोई नेटवर्क कनेक्शन होता है, यानी ऐप ऑनलाइन है, तो यह मास्टर सर्वर से प्रत्येक नए गंदे मॉडल उदाहरण के लिए एक स्थायी आईडी प्राप्त करता है। अस्थायी आईडी को स्थायी आईडी के साथ प्रतिस्थापित किया जाता है और फिर गंदे उदाहरण मास्टर को सिंक्रनाइज़ किए जाते हैं।

मैंने मास्टर सर्वर पर गंदे मॉडल उदाहरण प्राप्त करने और अद्यतन करने के लिए Django REST ढांचे का उपयोग किया।

ध्यान दें कि इसे ऑफ़लाइन कंप्यूटर पर स्थानीय वेब सर्वर चलाने की भी आवश्यकता है। मैंने उस के लिए चेरीपी चुना है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^