본문 바로가기
IT/Python

여러개의 DB를 Django 장고에 연동시키기

by Jang HyunWoong 2018. 11. 12.

기존 Mysql or Mariadb를 사용하고 있었고, 이것을 장고에 연결 시키려고 한다. 

1. django 프로젝트의 settings.py를 연다 .
DATABASES = {} 여기에 기본적으로 'default'라는 key가 있다. 
이 dictionary에 연결시킬 db정보를 넣는다. 
example로 'new_database' 로 넣었다.

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost', 'NAME': 'test_db', 'USER': 'root', 'PASSWORD': 'mypw', 'PORT': 3306, 'CHARSET': 'utf8mb4', }, 'new_db1': { 'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost', 'NAME': 'testdb2', 'USER': 'root', 'PASSWORD': 'mypw', 'PORT': 3306, 'CHARSET': 'utf8mb4', }, 'new_db2': { 'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost', 'NAME': 'testdb3', 'USER': 'root', 'PASSWORD': 'mypw', 'PORT': 3306, 'CHARSET': 'utf8mb4', }, }

2. database router 를 만들어 준다. 
settings.py에 아래 DATABASE_ROUTERS를 넣어준다. blog app안에 routers를 만들 것이다. 

DATABASE_ROUTERS = [ 'blog.routers.MultiDBRouter', # blog는 django app이다. ]

app 이름이 blog라면 project/blog/routers.py 를 만들어 준다. 
아래 사이트를 참고하여 router를 만들어 준다. 

example)

class MultiDBRouter(object): def __init__(self): self.model_list = ['new_db1', 'new_db2', 'default'] def db_for_read(self, model, **hints): if model._meta.app_label in self.model_list: return model._meta.app_label return None def db_for_write(self, model, **hints): if model._meta.app_label in self.model_list: print('db_for_write: %s' % model._meta.app_label) return model._meta.app_label return None def allow_relation(self, obj1, obj2, **hints): if obj1._meta.app_label in self.model_list or \ obj2._meta.app_label in self.model_list: return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): if app_label == 'blog': return db in self.model_list elif db == 'default': return True return None

* 나의 예는 default 로 오는 곳에 admin, auth, contenttypes, sessions 등의 정보를 넣기 위해서 migrate를 True로 넘겼다. 나머지 db에는 그런 기록이 필요 없기 때문에 해당 내용을 migrate를 하지 않는다. 

3. 기존에 db를 가져온다. 
$ python manage.py inspectdb --database=new_db1 > blog/new_models.py
new_db1의 database를 blog 안에 new_models.py 라는 이름으로 migrate 시킨다. 

blog/new_models.py 라는 파일이 생기면서 기존에 있던 db스킴들이 생겼을 것이다. 

* inspectdb는 Meta정보에 app_label을 생성하지 않는다. 이건 수동으로 하자.
3-1. new_models.py에 들어가서 class Meta: 아래에 app_label = '<db 이름 추가>' 하자
    ex) app_label = 'testdb2' 

4. $ python manage.py makemigrations
    $ python manage.py migrate

하면 끝.

blog/admin.py 에 들어가서 해당 모델을 등록 시킨 후 admin사이트에 가서 확인해 보자.

from django.contrib import admin from .models import Test # Register your models here. admin.site.register(Test)

* admin 사이트에 들어가려면 super user로 admin아이디를 하나 생성해야 한다. 안했으면 하자.
ex) $python manage.py createsuperuser

$python manage.py runserver

주소창에 localhost:8000/admin
아이디 치고 들어가면 데이터를 볼 수 있다.


반응형