मेरे सवाल पर टिप्पणियों के लिए धन्यवाद मैंने कुछ शोध किया और निम्नलिखित निष्कर्षों के साथ आया।
django_migrations
जब माइग्रेशन का उपयोग किया जाता है तो एक तालिका बनाने में कई डेटाबेस परिणाम का उपयोग करते हैं। केवल एक तालिका में पलायन रिकॉर्ड करने का कोई विकल्प नहीं है django_migrations
, जैसा कि कामिल निस्की की टिप्पणी बताती है। यह फ़ाइल पढ़ने के बाद स्पष्ट है django/db/migrations/recorder.py
।
मैं एक परियोजना foo
और परियोजना के bar
अंदर एक ऐप के साथ एक उदाहरण का वर्णन करूंगा । ऐप bar
में केवल एक मॉडल है Baz
।
हम प्रोजेक्ट बनाते हैं:
django-admin startproject foo
अब हमारे पास मुख्य परियोजना निर्देशिका के अंदर ये सामग्रियां हैं:
- foo
- manage.py
मुझे प्रोजेक्ट डायरेक्टरी के अंदर सभी ऐप्स को ग्रुप करने की आदत है:
mkdir foo/bar
python manage.py bar foo/bar
फ़ाइल में foo/settings.py
हम दो अलग-अलग डेटाबेस का उपयोग करने के लिए सेटिंग्स को समायोजित करते हैं, इस उदाहरण के प्रयोजनों के लिए हम उपयोग करते हैं sqlite3
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db1.sqlite3'),
},
'remote': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
}
}
अब हम माइग्रेशन चलाते हैं:
python manage.py migrate --database=default
यह सभी माइग्रेशन चलाता है, भाग --database=default
वैकल्पिक है, क्योंकि निर्दिष्ट नहीं Django डिफ़ॉल्ट डेटाबेस का उपयोग करता है।
प्रदर्शन करने के लिए ऑपरेशन:
सभी माइग्रेशन लागू करें: व्यवस्थापक, सामान्य, सामग्री, सत्र
चल रहे माइग्रेशन:
Contenttypes.0001_initial लागू कर रहा है ... ठीक है
लागू करने के लिए ,.00.00_initial ... ठीक है
व्यवस्थापन.0001_initial लागू कर रहा है ... ठीक है
व्यवस्थापक लागू कर रहा है2_logentry_remove_auto_add ... ठीक है
व्यवस्थापक लागू कर रहा है। 3_logentry_add_action_flag_choices ... ठीक है
Contenttypes.0002_remove_content_type_name ... ठीक लागू करना
लागू करने के लिए Cort.0002_alter_permission_name_max_length ... ठीक है
लागू करने के लिए और अधिक जानकारी प्राप्त करने के लिए, ठीक है ... ठीक है
लागू करने के लिए Cort.0004_alter_user_username_opts ... ठीक है
लागू करने के लिए Cort.0005_alter_user_last_login_null ... ठीक है
लागू करने के लिए Cort.0006_require_contenttypes_0002 ... ठीक है
लागू करने के लिए Cort.0007_alter_validators_add_error_messages ... ठीक है
लागू करने के लिए Cort.0008_alter_user_username_max_length ... ठीक है
लागू करने के लिए Cort.0009_alter_user_last_name_max_length ... ठीक है
लागू करने के लिए ,.00.00_alter_group_name_max_length ... ठीक है
लागू करने के लिए ,.00.00_update_proxy_permissions ... ठीक है
सत्र लागू कर रहा है
Django ने डिफ़ॉल्ट डेटाबेस पर सभी माइग्रेशन लागू किए हैं:
1 कंटेंटपाइप्स 0001_ इन्टेंशियल 2019-11-13 16: 51: 04.767382
2 अर्क 0001_अनुसंधान 2019-11-13 16: 51: 04.792245
3 व्यवस्थापक 0001_अनुसंधान 2019-11-13 16: 51: 04.827454
4 व्यवस्थापक 0002_logentr 2019-11-13 16: 51: 04.846627
5 व्यवस्थापक 0003_logentr 2019-11-13 16: 51: 04.864458
6 कंटेंटपाइप 0002_remove_ 2019-11-13 16: 51: 04.892220
7 स्कीम 0002_alter_p 2019-11-13 16: 51: 04.906449
8 स्कीम 0003_alter_u 2019-11-13 16: 51: 04.923902
9 ऑक्टेक्ट 0004_alter_u 2019-11-13 16: 51: 04.941707
10 कोटि 0005_alter_u 2019-11-13 16: 51: 04.958371
11 वस्तु 0006_require 2019-11-13 16: 51: 04.965527
12 वस्तुनिष्ठ 0007_alter_v 2019-11-13 16: 51: 04.981532
13 कोटि 0008_alter_u 2019-11-13 16: 51: 05.004149
14 स्कीम 0009_alter_u 2019-11-13 16: 51: 05.019705
15 अंक 0010_alter_g 2019-11-13 16: 51: 05.037023
16 अक्तूबर 0011_update_ 2019-11-13 16: 51: 05.054449
17 सेशन 0001_अनुसंधान 2019-11-13 16: 51: 05.063868
अब हम मॉडल बनाते हैं Baz
:
models.py
:
from django.db import models
class Baz(models.Model):
name = models.CharField(max_length=255, unique=True)
एप्लिकेशन bar
को INSTALLED_APPS
( foo/settings.py
) में पंजीकृत करें और थीम बनाएं:
python manage.py makemigrations bar
हम माइग्रेशन चलाने से पहले ऐप के routers.py
अंदर बनाते हैं bar
:
क्लास बाररूट (ऑब्जेक्ट):
def db_for_read (स्वयं, मॉडल, ** संकेत):
अगर मॉडल ।_मेटा.app_ लैबल == 'बार':
वापसी 'रिमोट'
कोई नहीं लौटा
def db_for_write (स्वयं, मॉडल, ** संकेत):
अगर मॉडल ।_मेटा.app_ लैबल == 'बार':
वापसी 'रिमोट'
कोई नहीं लौटा
def allow_relation (स्वयं, obj1, obj2, ** संकेत):
कोई नहीं लौटा
def allow_migrate (स्वयं, db, app_label, model_name = कोई नहीं, ** संकेत):
अगर app_label == 'बार':
वापसी db == 'दूरस्थ'
अगर db == 'रिमोट':
विवरण झूठा है
कोई नहीं लौटा
और इसे इसमें पंजीकृत करें foo/settings.py
:
DATABASE_ROUTERS = ['foo.bar.routers.BarRouter']
अब भोला दृष्टिकोण डेटाबेस bar
में माइग्रेशन चलाने के लिए होगा remote
:
python manage.py migrate bar --database=remote
प्रदर्शन करने के लिए ऑपरेशन:
सभी माइग्रेशन लागू करें: बार
रनिंग माइग्रेशन:
Bar.0001_initial लागू कर रहा है ... ठीक है
माइग्रेशन remote
डेटाबेस पर लागू किया गया है:
1 बार 0001_संस्थान 2019-11-13 17: 32: 39.701784
जब हम चलाते हैं:
python manage.py runserver
निम्नलिखित चेतावनी को उठाया जाएगा:
आपके पास 1 अप्रयुक्त माइग्रेशन है। जब तक आप ऐप (एस): बार के लिए माइग्रेशन लागू नहीं करते, आपका प्रोजेक्ट ठीक से काम नहीं कर सकता है।
उन्हें लागू करने के लिए 'अजगर प्रबंधन थिंक माइग्रेट' चलाएं।
हालांकि सब कुछ ठीक काम करने लगता है। हालाँकि यह इस चेतावनी के संतोषजनक नहीं है।
इस उत्तर में सुझाए गए अनुसार प्रत्येक डेटाबेस के लिए सभी माइग्रेशन चलाने का उचित तरीका होगा ।
यह इस तरह दिखेगा:
python manage.py migrate --database=default
python manage.py migrate --database=remote
और इसके लिए माइग्रेशन बनाने के बाद bar
:
python manage.py migrate bar --database=default
python manage.py migrate bar --database=remote
राउटर ध्यान रखेगा कि तालिका bar_baz
केवल remote
डेटाबेस में बनाई गई है, लेकिन Django दोनों डेटाबेस में लागू किए गए माइग्रेशन को चिह्नित करेगा। इसके अलावा के लिए टेबल auth
, admin
, sessions
, आदि में ही बनाया जाएगा default
, डेटाबेस में विनिर्दिष्ट routers.py
। डेटाबेस django_migrations
में तालिका में remote
इन पलायनों के रिकॉर्ड भी होंगे।
यह एक लंबी रीडिंग है, लेकिन मुझे उम्मीद है कि यह इस पर कुछ प्रकाश डालती है, मेरी राय में, आधिकारिक दस्तावेज में अच्छी तरह से समझाया गया मुद्दा नहीं है ।