মাত্র একটি টেবিল "জ্যাঙ্গো_মিজারেশন" দিয়ে জাজানোতে একাধিক ডাটাবেস ব্যবহার করুন


11

জাজানোতে একটি প্রকল্পের জন্য আমাকে দুটি ডাটাবেস ব্যবহার করতে হবে: ডিফল্ট এবং দূরবর্তী । আমি তৈরি করেছি routers.pyএবং সবকিছু ঠিকঠাক কাজ করে।

রিমোট ডাটাবেসে একটি টেবিল তৈরি করার প্রয়োজন ছিল এবং আমি মাইগ্রেশন তৈরি করেছি, এটি চালাব এবং টেবিলটি django_migrationsতৈরি হয়েছিল। আমি django_migrationsডিফল্ট ডাটাবেসে কেবল একটি টেবিল রাখতে চাই ।

সম্পর্কিত অংশটি routers.pyএখানে:

class MyRouter(object):
     # ...
     def allow_migrate(self, db, app_label, model_name=None, **hints):
         if app_label == 'my_app':
             return db == 'remote'
         return None

আমি এইভাবে মাইগ্রেশন চালাচ্ছি:

python manage.py migrate my_app --database=remote

এখন আমি যখন:

python manage.py runserver

আমি নিম্নলিখিত সতর্কতা পেতে:

আপনার কাছে 1 টি প্রয়োগহীন মাইগ্রেশন রয়েছে। আপনি অ্যাপ (গুলি) এর জন্য মাইগ্রেশন প্রয়োগ না করা পর্যন্ত আপনার প্রকল্পটি সঠিকভাবে কাজ করতে পারে না: my_app।
এগুলি প্রয়োগ করতে 'পাইথন ম্যানেজ.পি মাইগ্রেট' চালান।

এর জন্য সারণীগুলি ডাটাবেসে my_appতৈরি করা হয় এবং remoteডাটাবেসের django_migrationsঅভ্যন্তরে remoteস্থানান্তরগুলি প্রয়োগ হিসাবে চিহ্নিত করা হয়।

সম্পাদনা:
কীভাবে জ্যাঙ্গোকে কেবলমাত্র একটি টেবিল ব্যবহার করতে বাধ্য করা যায় django_migrations, কিন্তু এখনও বিভিন্ন ডাটাবেসে মাইগ্রেশন প্রয়োগ করা যায়?

বিভিন্ন ডাটাবেসে মাইগ্রেশন কীভাবে প্রয়োগ করতে হবে যাতে কোনও সতর্কতা উত্থাপিত হয় না?


1
'মাই_অ্যাপ' নয় এমন অন্যান্য অ্যাপ্লিকেশনের জন্য, অনুমতি_মাইগ্রেট কোনও কিছুই ফেরায় না। আপনি সেখানে অন্য চেক করতে চান? আপনার রাউটার থেকে আমি যা বুঝি সে থেকে 'মাই_এ্যাপ' 'রিমোট' ডাটাবেস ব্যবহার করে এবং অন্যান্য সমস্ত অ্যাপ্লিকেশন 'ডিফল্ট' ডাটাবেস ব্যবহার করবে?
মার্টিন টেলস্কি

@ এসজার আপনি প্রায় অসম্ভবকে চাইছেন। ভাগ করে নেওয়া django_migrationsটেবিলের জন্য সারি defaultএবং remoteডিবিতে মাইগ্রেশন সহ সারিগুলির মধ্যে পার্থক্য করা প্রয়োজন । এটি জ্যাঙ্গো অভ্যন্তরীণ অঞ্চলে বেশ গভীর। আমি এমনকি এটি ঝুঁকি নিয়ে বলব যে এটির জন্য মাইগ্রেশন কোডের পুনরায় লেখার প্রয়োজন হবে।
কামিল নিস্কি

@ কামিলনিস্কি আপনার মতামত ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ। আমি প্রশ্নটির উচ্চারণ করব।
cezar

উত্তর:


2

আমার প্রশ্নে মন্তব্য করার জন্য ধন্যবাদ আমি কিছু গবেষণা করেছি এবং নিম্নলিখিত ফলাফলগুলি নিয়ে এসেছি।

একাধিক ডাটাবেস ব্যবহারের ফলে 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=defaultisচ্ছিক, কারণ নির্দিষ্ট না থাকলে জ্যাঙ্গো ডিফল্ট ডাটাবেস ব্যবহার করে।

সঞ্চালনের জন্য অপারেশন: 
  সমস্ত স্থানান্তর প্রয়োগ করুন: অ্যাডমিন, লেখক, কন্টেন্ট টাইপস, সেশনগুলি
 চলমান মাইগ্রেশন:
  কন্টেন্ট টাইপ প্রয়োগ করা হচ্ছে
  লেখক প্রয়োগ করা হচ্ছে .0001_সনালিয়াল ... ঠিক আছে
  অ্যাডমিন প্রয়োগ করা হচ্ছে .0001_নাইটিয়াল ... ঠিক আছে
  অ্যাডমিন প্রয়োগ করা হচ্ছে
  অ্যাডমিন প্রয়োগ করা হচ্ছে 0000003_জল_ত্যাগ_অ্যাকশন_ফ্লেগ_চয়েজস ... ঠিক আছে
  কন্টেন্ট টাইপ প্রয়োগ করা হচ্ছে। 20002_ সরানো_ কনটেন্ট_ টাইপ_নাম ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে। 20002_াল্টার_প্রেমিশন_নাম_ম্যাক্স_লেন্থ ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে .0003_াল্টার_উজার_ইমেল_ম্যাক্স_সামগ্রী ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে .0004_াল্টার_উজার_উসনেজার_অ্যাপস ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে 0000005_alter_user_last_login_null ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে .0006_ প্রয়োজনীয়তা_ কনটেন্টটিপস_0002 ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে .0007_াল্টার_অালিডেটর_অ্যাড_অরার_মেসেজগুলি ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে .0008_াল্টার_উজার_উসনেমার_ম্যাক্স_লেন্থ ... ঠিক আছে
  লেখক প্রয়োগ করা হচ্ছে .0009_াল্টার_উজার_লাস্ট_নাম_ম্যাক্স_সামগ্রী ... ঠিক আছে
  প্রবন্ধ প্রয়োগ করা হচ্ছে ১০০০_ল্টার_গোষ্ঠী_নাম_ম্যাক্স_সামগ্রী ... ঠিক আছে
  প্রবন্ধ প্রয়োগ করা হচ্ছে 0.011_update_proxy_permission ... ঠিক আছে
  সেশন প্রয়োগ করা হচ্ছে

জ্যাঙ্গো সমস্ত মাইগ্রেশন ডিফল্ট ডাটাবেসে প্রয়োগ করেছে:

1 বিষয়বস্তু 0001_initial 2019-11-13 16: 51: 04.767382
2 লেখক 0001_initial 2019-11-13 16: 51: 04.792245
3 অ্যাডমিন 0001_initial 2019-11-13 16: 51: 04.827454
4 অ্যাডমিন 0002_ লজেন্টার 2019-11-13 16: 51: 04.846627
5 অ্যাডমিন 0003_ লজেন্টার 2019-11-13 16: 51: 04.864458
6 কনটেন্ট টাইপস 0002_মরোভ_ 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_ পুনরুদ্ধার 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_াল্টার_জি 2019-11-13 16: 51: 05.037023
16 লেখক 0011_update_ 2019-11-13 16: 51: 05.054449
17 সেশনগুলি 0001_initial 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) এবং themigrations তৈরি করুন:

python manage.py makemigrations bar

আমরা মাইগ্রেশন চালানোর আগে আমরা অ্যাপের routers.pyঅভ্যন্তরে তৈরি করি bar:

ক্লাস বারআউটার (অবজেক্ট):
    Def db_for_read (স্ব, মডেল, ** ইঙ্গিত):
        যদি মডেল._মেটা.এপ_লেবেল == 'বার':
            'রিমোট' ফিরে
        কোনটিই ফেরেনি

    Def db_for_writ (স্ব, মডেল, ** ইঙ্গিত):
        যদি মডেল._মেটা.এপ_লেবেল == 'বার':
            'রিমোট' ফিরে
        কোনটিই ফেরেনি

    Def অনুমতি_ সম্পর্কিত (স্ব, আপত্তি 1, আপত্তি 2, ** ইঙ্গিত):
        কোনটিই ফেরেনি

    Def অনুমতি_migrate (স্ব, ডিবি, অ্যাপ_লেবেল, মডেল_নাম = কোনও নয়, ** ইঙ্গিত):
        যদি app_label == 'বার':
            ফিরতি ডিবি == 'রিমোট'
        যদি ডিবি == 'রিমোট':
            প্রত্যাবর্তন মিথ্যা
        কোনটিই ফেরেনি

এবং এটিতে নিবন্ধ করুন foo/settings.py:

DATABASE_ROUTERS = ['foo.bar.routers.BarRouter']

এখন সাদাসিধা পদ্ধতির জন্য মাইগ্রেশন চালানো হবে barমধ্যে remoteডাটাবেসের:

python manage.py migrate bar --database=remote
অপারেশনগুলি করার জন্য: 
  সমস্ত মাইগ্রেশন প্রয়োগ করুন: বার
 চলমান মাইগ্রেশন:
  বার প্রয়োগ করা হচ্ছে

স্থানান্তরগুলি remoteডাটাবেসে প্রয়োগ করা হয়েছে :

1 বার 0001_initial 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ডাটাবেসে তৈরি হয়েছে, তবে জ্যাঙ্গো উভয় ডাটাবেসে প্রয়োগ হিসাবে স্থানান্তর চিহ্নিত করবে। এছাড়াও টেবিল auth, admin, sessions, ইত্যাদি শুধুমাত্র তৈরি করা হবে default, ডাটাবেজ উল্লেখিত routers.py। টেবিল django_migrationsমধ্যে remoteডাটাবেসের খুব এই মাইগ্রেশন জন্য রেকর্ড থাকবে।

এটি একটি দীর্ঘ পঠন, তবে আমি আশা করি এটি সরকারী ডকুমেন্টেশনে ইস্যুটির পুরোপুরি ব্যাখ্যা না করে আমার মতে এটি সম্পর্কে কিছুটা আলোকপাত করবে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.