DjangoããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã®å æ¬çãªã¬ã€ããæ§æãå®è£ ãããã³ãã«ãããŒã¿ããŒã¹èšå®ã管çããããã®é«åºŠãªãã¯ããã¯ãã«ããŒããŸãã
DjangoããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ïŒãã«ãããŒã¿ããŒã¹æ§æããã¹ã¿ãŒãã
Djangoã¯ã匷åãªPython Webãã¬ãŒã ã¯ãŒã¯ã§ãããåäžã®ãããžã§ã¯ãå ã§è€æ°ã®ããŒã¿ããŒã¹ã管çããããã®æè»ãªã¡ã«ããºã ãæäŸããŸããããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ãšããŠç¥ããããã®æ©èœã䜿çšãããšãããŸããŸãªããŒã¿ããŒã¹æäœïŒèªã¿åããæžã蟌ã¿ãç§»è¡ïŒãç¹å®ã®ããŒã¿ããŒã¹ã«æç€ºã§ããããŒã¿åé¢ãã·ã£ãŒãã£ã³ã°ãããã³èªã¿åãã¬ããªã«ã®å®è£ ã®ããã®é«åºŠãªã¢ãŒããã¯ãã£ãæå¹ã«ã§ããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãåºæ¬çãªæ§æããé«åºŠãªãã¯ããã¯ãŸã§ãã¹ãŠãç¶²çŸ ããDjangoããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã®è€éããæãäžããŸãã
ãã«ãããŒã¿ããŒã¹æ§æã䜿çšããçç±
æè¡çãªè©³çްã«å ¥ãåã«ããã«ãããŒã¿ããŒã¹èšå®ã䜿çšããåæ©ãçè§£ããããšãäžå¯æ¬ ã§ããããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ãéåžžã«è²Žéã§ããããšã蚌æãããŠããäžè¬çãªã·ããªãªã次ã«ç€ºããŸãã
- ããŒã¿ã®åé¢ïŒæ©èœãŸãã¯éšéã«åºã¥ããŠããŒã¿ãåé¢ããŸããããšãã°ããŠãŒã¶ãŒãããã¡ã€ã«ã1ã€ã®ããŒã¿ããŒã¹ã«ãéèãã©ã³ã¶ã¯ã·ã§ã³ãå¥ã®ããŒã¿ããŒã¹ã«ä¿åã§ããŸããããã«ãããã»ãã¥ãªãã£ã匷åãããããŒã¿ç®¡çãç°¡çŽ åãããŸããã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ããã顧客ããŒã¿ïŒååãäœæïŒããã©ã³ã¶ã¯ã·ã§ã³ããŒã¿ïŒæ³šæå±¥æŽãæ¯æã詳现ïŒããåé¢ãããšãæ©å¯æ§ã®é«ãéèæ å ±ã«å¯Ÿããä¿è·ã®å±€ã远å ãããŸãã
- ã·ã£ãŒãã£ã³ã°ïŒããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãåäžãããããã«ãããŒã¿ãè€æ°ã®ããŒã¿ããŒã¹ã«åæ£ããŸããäœçŸäžäººãã®ãŠãŒã¶ãŒããããœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ãèããŠãã ãããå°ççå°åïŒåç±³ããšãŒããããã¢ãžã¢ãªã©ïŒã«åºã¥ããŠãŠãŒã¶ãŒããŒã¿ãã·ã£ãŒãã£ã³ã°ãããšãããŒã¿ãžã®ã¢ã¯ã»ã¹ãé«éåãããåã ã®ããŒã¿ããŒã¹ãžã®è² è·ã軜æžãããŸãã
- èªã¿åãã¬ããªã«ïŒãã©ã€ããªããŒã¿ããŒã¹ãžã®è² è·ã軜æžããããã«ãèªã¿åãæäœããã©ã€ããªããŒã¿ããŒã¹ã®èªã¿åãå°çšã¬ããªã«ã«ãªãããŒãããŸããããã¯ãèªã¿åãè² è·ã®é«ãã¢ããªã±ãŒã·ã§ã³ã«ç¹ã«åœ¹ç«ã¡ãŸããäŸãšããŠã¯ãéå ±ãã¥ãŒã¹ã€ãã³ãäžã«å€§éã®ãã©ãã£ãã¯ãåŠçããããã«è€æ°ã®èªã¿åãã¬ããªã«ã䜿çšãããã¥ãŒã¹Webãµã€ããããããã©ã€ããªããŒã¿ããŒã¹ã¯ã³ã³ãã³ãã®æŽæ°ãåŠçããŸãã
- ã¬ã¬ã·ãŒã·ã¹ãã çµ±åïŒçµç¹å ã«æ¢ã«ååšããå¯èœæ§ã®ããç°ãªãããŒã¿ããŒã¹ã·ã¹ãã ïŒPostgreSQLãMySQLãOracleãªã©ïŒã«æ¥ç¶ããŸããå€ãã®å€§äŒæ¥ã«ã¯ãå€ãããŒã¿ããŒã¹ãã¯ãããžãŒã䜿çšããã¬ã¬ã·ãŒã·ã¹ãã ããããŸããããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã䜿çšãããšãDjangoã¢ããªã±ãŒã·ã§ã³ã¯å®å šãªç§»è¡ãå¿ èŠãšããã«ãããã®ã·ã¹ãã ãšå¯Ÿè©±ã§ããŸãã
- A/Bãã¹ãïŒæ¬çªããŒã¿ããŒã¹ã«åœ±é¿ãäžããããšãªããç°ãªãããŒã¿ã»ããã§A/Bãã¹ããå®è¡ããŸããããšãã°ããªã³ã©ã€ã³ããŒã±ãã£ã³ã°äŒç€Ÿã¯ãç°ãªãåºåãã£ã³ããŒã³ãšã©ã³ãã£ã³ã°ããŒãžãã¶ã€ã³ã®ããã©ãŒãã³ã¹ã远跡ããããã«ãåå¥ã®ããŒã¿ããŒã¹ã䜿çšããå ŽåããããŸãã
- ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ïŒãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§ã¯ãåãµãŒãã¹ã«ã¯ç¬èªã®å°çšããŒã¿ããŒã¹ãããããšããããããŸãã DjangoããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã¯ããããã®ãµãŒãã¹ã®çµ±åã容æã«ããŸãã
Djangoã§ã®è€æ°ã®ããŒã¿ããŒã¹ã®æ§æ
ããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ãå®è£ ããæåã®ã¹ãããã¯ã`settings.py`ãã¡ã€ã«ã§`DATABASES`èšå®ãæ§æããããšã§ãããã®ãã£ã¯ã·ã§ããªã¯ãåããŒã¿ããŒã¹ã®æ¥ç¶ãã©ã¡ãŒã¿ãŒãå®çŸ©ããŸãã
```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '5432', }, 'users': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'user_database', 'USER': 'user_db_user', 'PASSWORD': 'user_db_password', 'HOST': 'db.example.com', 'PORT': '3306', }, 'analytics': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'analytics.db', }, } ```ãã®äŸã§ã¯ã3ã€ã®ããŒã¿ããŒã¹`default`ïŒPostgreSQLããŒã¿ããŒã¹ïŒã`users`ïŒMySQLããŒã¿ããŒã¹ïŒãããã³`analytics`ïŒSQLiteããŒã¿ããŒã¹ïŒãå®çŸ©ããŸããã`ENGINE`èšå®ã¯ã䜿çšããããŒã¿ããŒã¹ããã¯ãšã³ããæå®ããä»ã®èšå®ã¯å¿ èŠãªæ¥ç¶ã®è©³çްãæäŸããŸãããããã®èšå®ãæ§æããåã«ãé©åãªããŒã¿ããŒã¹ãã©ã€ããŒïŒPostgreSQLã®å Žåã¯`psycopg2`ãMySQLã®å Žåã¯`mysqlclient`ãªã©ïŒãã€ã³ã¹ããŒã«ããããšãå¿ããªãã§ãã ããã
ããŒã¿ããŒã¹ã«ãŒã¿ãŒã®äœæ
DjangoããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã®äžæ žã¯ãããŒã¿ããŒã¹ã«ãŒã¿ãŒã¯ã©ã¹ã®äœæã«ãããŸãããããã®ã¯ã©ã¹ã¯ãç¹å®ã®ã¢ãã«æäœã«äœ¿çšããããŒã¿ããŒã¹ã決å®ããããã®ã«ãŒã«ãå®çŸ©ããŸããã«ãŒã¿ãŒã¯ã©ã¹ã¯ã次ã®ã¡ãœããã®å°ãªããšã1ã€ãå®è£ ããå¿ èŠããããŸãã
- `db_for_read(model, **hints)`ïŒæå®ãããã¢ãã«ã®èªã¿åãæäœã«äœ¿çšããããŒã¿ããŒã¹ãšã€ãªã¢ã¹ãè¿ããŸãã
- `db_for_write(model, **hints)`ïŒæå®ãããã¢ãã«ã®æžãèŸŒã¿æäœïŒäœæãæŽæ°ãåé€ïŒã«äœ¿çšããããŒã¿ããŒã¹ãšã€ãªã¢ã¹ãè¿ããŸãã
- `allow_relation(obj1, obj2, **hints)`ïŒ`obj1`ãš`obj2`ã®éã®é¢ä¿ãèš±å¯ãããŠããå Žåã¯`True`ãèš±å¯ãããŠããªãå Žåã¯`False`ãæèŠããªãããšã瀺ãå Žåã¯`None`ãè¿ããŸãã
- `allow_migrate(db, app_label, model_name=None, **hints)`ïŒç§»è¡ãæå®ãããããŒã¿ããŒã¹ã«é©çšããå¿ èŠãããå Žåã¯`True`ãã¹ãããããå¿ èŠãããå Žåã¯`False`ãæèŠããªãããšã瀺ãå Žåã¯`None`ãè¿ããŸãã
`users`ã¢ããªã®ã¢ãã«ã«å¯Ÿãããã¹ãŠã®æäœã`users`ããŒã¿ããŒã¹ã«éä¿¡ããåçŽãªã«ãŒã¿ãŒãäœæããŸãããã
```python # routers.py class UserRouter: """ A router to control all database operations on models in the users application. """ route_app_labels = {'users'} def db_for_read(self, model, **hints): """ Attempts to read users models go to users_db. """ if model._meta.app_label in self.route_app_labels: return 'users' return None def db_for_write(self, model, **hints): """ Attempts to write users models go to users_db. """ if model._meta.app_label in self.route_app_labels: return 'users' return 'default' def allow_relation(self, obj1, obj2, **hints): """ Allow relations if a model in the users app is involved. """ if ( obj1._meta.app_label in self.route_app_labels or obj2._meta.app_label in self.route_app_labels ): return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): """ Make sure the users app only appears in the 'users' database. """ if app_label in self.route_app_labels: return db == 'users' return True ```ãã®ã«ãŒã¿ãŒã¯ãã¢ãã«ã®ã¢ããªã©ãã«ã`route_app_labels`ã«ãããã©ããã確èªããŸããããå Žåã¯ãèªã¿åãããã³æžãèŸŒã¿æäœã«å¯ŸããŠ`users`ããŒã¿ããŒã¹ãšã€ãªã¢ã¹ãè¿ããŸãã `allow_relation`ã¡ãœããã¯ã`users`ã¢ããªã®ã¢ãã«ãé¢ä¿ããŠããå Žåã«é¢ä¿ãèš±å¯ããŸãã `allow_migrate`ã¡ãœããã¯ã`users`ã¢ããªã®ç§»è¡ã`users`ããŒã¿ããŒã¹ã«ã®ã¿é©çšãããããã«ããŸããããŒã¿ããŒã¹ã®äžæŽåãé²ãã«ã¯ã`allow_migrate`ãæ£ããå®è£ ããããšãéèŠã§ãã
ã«ãŒã¿ãŒã®ã¢ã¯ãã£ãå
ã«ãŒã¿ãŒãã¢ã¯ãã£ãåããã«ã¯ã`settings.py`ãã¡ã€ã«ã®`DATABASE_ROUTERS`èšå®ã«ã«ãŒã¿ãŒã远å ããå¿ èŠããããŸãã
```python DATABASE_ROUTERS = ['your_project.routers.UserRouter'] ````your_project.routers.UserRouter`ãã«ãŒã¿ãŒã¯ã©ã¹ãžã®å®éã®ãã¹ã«çœ®ãæããŸãããã®ãªã¹ãã®ã«ãŒã¿ãŒã®é åºã¯éèŠã§ããDjangoã¯ãé`None`å€ãè¿ããŸã§ã«ãŒã¿ãŒãå埩åŠçããŸããã«ãŒã¿ãŒãããŒã¿ããŒã¹ãšã€ãªã¢ã¹ãè¿ããªãå ŽåãDjangoã¯`default`ããŒã¿ããŒã¹ã䜿çšããŸãã
é«åºŠãªã«ãŒãã£ã³ã°ãã¯ããã¯
åã®äŸã§ã¯ãã¢ããªã©ãã«ã«åºã¥ããŠã«ãŒãã£ã³ã°ããåçŽãªã«ãŒã¿ãŒã瀺ããŠããŸãããã ããããŸããŸãªåºæºã«åºã¥ããŠãããæŽç·Žãããã«ãŒã¿ãŒãäœæã§ããŸãã
ã¢ãã«ã¯ã©ã¹ã«åºã¥ãã«ãŒãã£ã³ã°
ã¢ãã«ã¯ã©ã¹èªäœã«åºã¥ããŠã«ãŒãã£ã³ã°ã§ããŸããããšãã°ãç¹å®ã®ã¢ãã«ã®ãã¹ãŠã®èªã¿åãæäœãèªã¿åãã¬ããªã«ã«ã«ãŒãã£ã³ã°ããå ŽåããããŸãã
```python class ReadReplicaRouter: """ Routes read operations for specific models to a read replica. """ read_replica_models = ['myapp.MyModel', 'anotherapp.AnotherModel'] def db_for_read(self, model, **hints): if f'{model._meta.app_label}.{model._meta.model_name.capitalize()}' in self.read_replica_models: return 'read_replica' return None def db_for_write(self, model, **hints): return 'default' def allow_relation(self, obj1, obj2, **hints): return True def allow_migrate(self, db, app_label, model_name=None, **hints): return True ```ãã®ã«ãŒã¿ãŒã¯ãã¢ãã«ã®å®å šä¿®é£Ÿåã`read_replica_models`ã«ãããã©ããã確èªããŸããããå Žåã¯ãèªã¿åãæäœã«å¯ŸããŠ`read_replica`ããŒã¿ããŒã¹ãšã€ãªã¢ã¹ãè¿ããŸãããã¹ãŠã®æžãèŸŒã¿æäœã¯ã`default`ããŒã¿ããŒã¹ã«éä¿¡ãããŸãã
ãã³ãã®äœ¿çš
Djangoã«ã¯ãã«ãŒã¿ãŒã«è¿œå æ å ±ãæž¡ãããã«äœ¿çšã§ãã`hints`ãã£ã¯ã·ã§ããªãçšæãããŠããŸãããã³ãã䜿çšãããšãã©ã³ã¿ã€ã æ¡ä»¶ã«åºã¥ããŠäœ¿çšããããŒã¿ããŒã¹ãåçã«æ±ºå®ã§ããŸãã
```python # views.py from django.db import connections from myapp.models import MyModel def my_view(request): # Force reads from the 'users' database instance = MyModel.objects.using('users').get(pk=1) # Create a new object using 'analytics' database new_instance = MyModel(name='New Object') new_instance.save(using='analytics') return HttpResponse("Success!") ````using()`ã¡ãœããã䜿çšãããšãç¹å®ã®ã¯ãšãªãŸãã¯æäœã«äœ¿çšããããŒã¿ããŒã¹ãæå®ã§ããŸããæ¬¡ã«ãã«ãŒã¿ãŒã¯`hints`ãã£ã¯ã·ã§ããªãä»ããŠãã®æ å ±ã«ã¢ã¯ã»ã¹ã§ããŸãã
ãŠãŒã¶ãŒã¿ã€ãã«åºã¥ãã«ãŒãã£ã³ã°
ç°ãªããŠãŒã¶ãŒã¿ã€ãïŒç®¡çè ãäžè¬ãŠãŒã¶ãŒãªã©ïŒã®ããŒã¿ãåå¥ã®ããŒã¿ããŒã¹ã«ä¿åããã·ããªãªãæ³åããŠãã ããããŠãŒã¶ãŒã®ã¿ã€ãã確èªããããã«å¿ããŠã«ãŒãã£ã³ã°ããã«ãŒã¿ãŒãäœæã§ããŸãã
```python # routers.py from django.contrib.auth import get_user_model class UserTypeRouter: """ Routes database operations based on user type. """ def db_for_read(self, model, **hints): user = hints.get('instance') # Attempt to extract user instance if user and user.is_superuser: return 'admin_db' return 'default' def db_for_write(self, model, **hints): user = hints.get('instance') # Attempt to extract user instance if user and user.is_superuser: return 'admin_db' return 'default' def allow_relation(self, obj1, obj2, **hints): return True def allow_migrate(self, db, app_label, model_name=None, **hints): return True ```ãã®ã«ãŒã¿ãŒã䜿çšããã«ã¯ãããŒã¿ããŒã¹æäœãå®è¡ãããšãã«ãŠãŒã¶ãŒã€ã³ã¹ã¿ã³ã¹ããã³ããšããŠæž¡ãå¿ èŠããããŸãã
```python # views.py from myapp.models import MyModel def my_view(request): user = request.user instance = MyModel.objects.using('default').get(pk=1) # Pass the user instance as a hint during save new_instance = MyModel(name='New Object') new_instance.save(using='default', update_fields=['name'], instance=user) # Pass user as instance return HttpResponse("Success!") ```ããã«ããã管çè ãŠãŒã¶ãŒãé¢äžããæäœã¯`admin_db`ããŒã¿ããŒã¹ã«ã«ãŒãã£ã³ã°ãããäžè¬ãŠãŒã¶ãŒãé¢äžããæäœã¯`default`ããŒã¿ããŒã¹ã«ã«ãŒãã£ã³ã°ãããŸãã
ç§»è¡ã«é¢ããèæ ®äºé
ãã«ãããŒã¿ããŒã¹ç°å¢ã§ç§»è¡ã管çããã«ã¯ã泚æãå¿ èŠã§ããã«ãŒã¿ãŒã®`allow_migrate`ã¡ãœããã¯ãåããŒã¿ããŒã¹ã«é©çšãããç§»è¡ã決å®ããäžã§éèŠãªåœ¹å²ãæãããŸãããã®ã¡ãœãããçè§£ããŠé©åã«äœ¿çšããããšãäžå¯æ¬ ã§ãã
ç§»è¡ãå®è¡ãããšãã«ã`--database`ãªãã·ã§ã³ã䜿çšããŠç§»è¡ããããŒã¿ããŒã¹ãæå®ã§ããŸãã
```bash python manage.py migrate --database=users ```ããã«ãããç§»è¡ã¯`users`ããŒã¿ããŒã¹ã«ã®ã¿é©çšãããŸããã¹ããŒãããã¹ãŠã®ããŒã¿ããŒã¹ã§äžè²«ããŠããããšã確èªããããã«ãããŒã¿ããŒã¹ããšã«ç§»è¡ãåå¥ã«å®è¡ããŠãã ããã
ãã«ãããŒã¿ããŒã¹æ§æã®ãã¹ã
ããŒã¿ããŒã¹ã«ãŒãã£ã³ã°æ§æããã¹ãããŠãæ³å®ã©ããã«åäœããŠããããšã確èªããããšãäžå¯æ¬ ã§ãã Djangoã®ãã¹ããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãããŒã¿ãæ£ããããŒã¿ããŒã¹ã«æžã蟌ãŸããŠããããšã確èªãããŠããããã¹ããäœæã§ããŸãã
```python # tests.py from django.test import TestCase from myapp.models import MyModel from django.db import connections class DatabaseRoutingTest(TestCase): def test_data_is_written_to_correct_database(self): # Create an object instance = MyModel.objects.create(name='Test Object') # Check which database the object was saved to db = connections[instance._state.db] self.assertEqual(instance._state.db, 'default') # Replace 'default' with expected database # Retrieve object from specific database instance_from_other_db = MyModel.objects.using('users').get(pk=instance.pk) # Make sure there are no errors, and that everything is working as expected self.assertEqual(instance_from_other_db.name, "Test Object") ```ãã®ãã¹ãã±ãŒã¹ã§ã¯ããªããžã§ã¯ããäœæãããããäºæãããããŒã¿ããŒã¹ã«ä¿åãããããšã確èªããŸããåæ§ã®ãã¹ããäœæããŠãèªã¿åãæäœãããŒã¿ããŒã¹ã«ãŒãã£ã³ã°æ§æã®ãã®ä»ã®åŽé¢ã確èªã§ããŸãã
ããã©ãŒãã³ã¹ã®æé©å
ããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã¯æè»æ§ãæäŸããŸãããããã©ãŒãã³ã¹ã«äžããæœåšçãªåœ±é¿ãèæ ®ããããšãéèŠã§ãããã«ãããŒã¿ããŒã¹ç°å¢ã§ããã©ãŒãã³ã¹ãæé©åããããã®ãã³ããæ¬¡ã«ç€ºããŸãã
- ã¯ãã¹ããŒã¿ããŒã¹çµåã®æå°åïŒã¯ãã¹ããŒã¿ããŒã¹çµåã¯ãããŒã¿ããŒã¹éã§ããŒã¿ã転éããå¿ èŠããããããã³ã¹ãããããå¯èœæ§ããããŸããå¯èœãªéãåé¿ããããã«ããŠãã ããã
- ãã£ãã·ã¥ã®äœ¿çšïŒãã£ãã·ã¥ã䜿çšãããšãé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ãã¡ã¢ãªã«ä¿åããããšã§ãããŒã¿ããŒã¹ã®è² è·ã軜æžã§ããŸãã
- ã¯ãšãªã®æé©åïŒã¯ãšãªãé©åã«æé©åãããããŒã¿ããŒã¹ããèªã¿åãå¿ èŠã®ããããŒã¿ã®éãæå°éã«æããããã«ããŸãã
- ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã®ç£èŠïŒããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã宿çã«ç£èŠããŠãããã«ããã¯ãšæ¹åã®äœå°ãããé åãç¹å®ããŸãã PrometheusãGrafanaãªã©ã®ããŒã«ã¯ãããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã¡ããªãã¯ã«é¢ãã貎éãªæŽå¯ãæäŸã§ããŸãã
- æ¥ç¶ããŒãªã³ã°ïŒæ¥ç¶ããŒãªã³ã°ã䜿çšããŠãæ°ããããŒã¿ããŒã¹æ¥ç¶ã®ç¢ºç«ã®ãªãŒããŒããããåæžããŸãã Djangoã¯èªåçã«æ¥ç¶ããŒãªã³ã°ã䜿çšããŸãã
ããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã®ãã¹ããã©ã¯ãã£ã¹
Djangoã§ããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ãå®è£ ããéã«åŸãã¹ããã¹ããã©ã¯ãã£ã¹ã次ã«ç€ºããŸãã
- ã«ãŒã¿ãŒãã·ã³ãã«ã«ä¿ã€ïŒã«ãŒã¿ãŒã®ããžãã¯ãè€éã«ãªããšãä¿å®ãšãããã°ãé£ãããªãå¯èœæ§ããããããé¿ããŠãã ãããã·ã³ãã«ã§æç¢ºã«å®çŸ©ãããã«ãŒãã£ã³ã°ã«ãŒã«ã¯ãçè§£ããŠãã©ãã«ã·ã¥ãŒãã£ã³ã°ã容æã§ãã
- æ§æã®ããã¥ã¡ã³ãåïŒåããŒã¿ããŒã¹ã®ç®çãèšå®ãããŠããã«ãŒãã£ã³ã°ã«ãŒã«ãªã©ãããŒã¿ããŒã¹ã«ãŒãã£ã³ã°æ§æãæç¢ºã«ããã¥ã¡ã³ãåããŸãã
- 培åºçãªãã¹ãïŒããŒã¿ããŒã¹ã«ãŒãã£ã³ã°æ§æãæ£ããåäœããŠããããšã確èªããããã«ãå æ¬çãªãã¹ããäœæããŸãã
- ããŒã¿ããŒã¹ã®äžè²«æ§ã®èæ ®ïŒç¹ã«è€æ°ã®æžã蟌ã¿ããŒã¿ããŒã¹ãæ±ãå Žåã¯ãããŒã¿ããŒã¹ã®äžè²«æ§ã«æ³šæããŠãã ããã忣ãã©ã³ã¶ã¯ã·ã§ã³ãæçµçãªæŽåæ§ãªã©ã®ææ³ã¯ãããŒã¿æŽåæ§ãç¶æããããã«å¿ èŠãªå ŽåããããŸãã
- ã¹ã±ãŒã©ããªãã£ã®èšç»ïŒã¹ã±ãŒã©ããªãã£ã念é ã«çœ®ããŠããŒã¿ããŒã¹ã«ãŒãã£ã³ã°æ§æãèšèšããŸããã¢ããªã±ãŒã·ã§ã³ã®æé·ã«åãããŠæ§æãã©ã®ããã«å€æŽããå¿ èŠãããããæ€èšããŠãã ããã
DjangoããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã®ä»£æ¿
Djangoã«çµã¿èŸŒãŸããŠããããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã¯åŒ·åã§ããã代æ¿ã¢ãããŒãã®æ¹ãé©åãªç¶æ³ããããŸããæ€èšãã¹ãããã€ãã®ä»£æ¿ææ®µã次ã«ç€ºããŸãã
- ããŒã¿ããŒã¹ãã¥ãŒïŒèªã¿åãå°çšã®ã·ããªãªã§ã¯ãããŒã¿ããŒã¹ãã¥ãŒã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ã«ãŒãã£ã³ã°ãå¿ èŠãšããã«ãè€æ°ã®ããŒã¿ããŒã¹ããããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã
- ããŒã¿ãŠã§ã¢ããŠãžã³ã°ïŒã¬ããŒããšåæã®ããã«è€æ°ã®ããŒã¿ããŒã¹ããããŒã¿ãçµåããå¿ èŠãããå Žåã¯ãããŒã¿ãŠã§ã¢ããŠã¹ãœãªã¥ãŒã·ã§ã³ã®æ¹ãé©ããŠããå ŽåããããŸãã
- Database-as-a-ServiceïŒDBaaSïŒïŒã¯ã©ãŠãããŒã¹ã®DBaaSãããã€ããŒã¯ãèªåã·ã£ãŒãã£ã³ã°ãèªã¿åãã¬ããªã«ç®¡çãªã©ã®æ©èœãæäŸããããšãå€ãããã«ãããŒã¿ããŒã¹ã®ãããã€ã¡ã³ããç°¡çŽ åã§ããŸãã
çµè«
DjangoããŒã¿ããŒã¹ã«ãŒãã£ã³ã°ã¯ãåäžã®ãããžã§ã¯ãå ã§è€æ°ã®ããŒã¿ããŒã¹ã管çã§ãã匷åãªæ©èœã§ãããã®ã¬ã€ãã§èª¬æããæŠå¿µãšãã¯ããã¯ãçè§£ããããšã§ãããŒã¿åé¢ãã·ã£ãŒãã£ã³ã°ãèªã¿åãã¬ããªã«ãããã³ãã®ä»ã®é«åºŠãªã·ããªãªã«å¯ŸããŠãã«ãããŒã¿ããŒã¹æ§æã广çã«å®è£ ã§ããŸããæ§æãæ éã«èšç»ãã培åºçãªãã¹ããäœæããããã©ãŒãã³ã¹ãç£èŠããŠããã«ãããŒã¿ããŒã¹èšå®ãæé©ã«åäœããŠããããšã確èªããŠãã ããããã®æ©èœã«ãããéçºè ã¯ãè€éãªããŒã¿èŠä»¶ãåŠçããäžçäžã®å€åããããžãã¹ããŒãºã«é©å¿ã§ããã¹ã±ãŒã©ãã«ã§å ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ããŒã«ãå©çšã§ããŸãããã®ãã¯ããã¯ãç¿åŸããããšã¯ãå€§èŠæš¡ã§è€éãªãããžã§ã¯ãã«åãçµãã§ããDjangoéçºè ã«ãšã£ãŠè²Žéãªè³ç£ã§ãã