[Django]Django의 Inspectdb을 이용해 외부 DB에 대해 ORM를 써보자!

Edit

[Django]Django의 Inspectdb을 이용해 외부 DB에 대해 ORM를 써보자!

Django를 하다보면 외부 DB의 정보를 가져와서 사용해야할 경우가 있는데 sql문으로 외부 DB를 가져오기에는 장고의 ORM기능이 너무 아까울때가 있다.

Django에서는 다행히도 외부 DB에 대해 inspectdb라는 기능을 제공하고 있다. inspectdb를 사용하면 실제 DB를 만들지는 않고 외부 DB를 가져와 model로 만들어주는 정말 편리한 기능이다.

기본적으로 inspectdb를 사용할려면 외부 DB에 대한 접속 정보가 있어야한다. 이는 settings.pyDATABASE를 설정해주면 된다. 장고를 처음 생성하면 DATABASEdefault로 되어 있을 것이다. 여기에 원하는 이름의 외부 DB 접속 정보를 넣어주면 된다.

# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '3306'
},
'external': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '',
'USER': '',
'PASSWORD': '',
'HOST': '',
}
}

여기서 external이라는 이름으로 추가를 했는데 이름은 마음대로 지어도 된다.

이제 inspectdb를 사용해보자. users라는 앱 안에 models.py에 저장하도록 해보자.

$ python manage.py inspectdb > 'users/models.py' --database 'external'

이렇게 하면 users 앱 안의 models.py에 외부 Table이 model 형태로 이쁘게 저장되어 있을 것이다.
이렇게 가져온 Table를 ORM으로 사용하기 위해서는 다음과 같이 하면 됩니다. MyUser라는 모델은 외부 DB에 있는 테이블 명으로 inspectdb 명령어로 통해 자동 생성된 모델이다.

# users/views.py
from users.models import MyUser
# using을 이용해 앞서 설정한 external 이름을 넣어주면 된다.
queryset = MyUser.objects.using('external').all()

inspectdb는 엄청 편리한 기능이긴 하지만 몇가지 주의해야할 점이 있다.

  1. 기본적으로 관계형 테이블만 가능하다. 하지만 MySql의 ` bit 타입은 제대로 가지고 오지 못하는 등 여러 문제가 있긴 하다.
  2. 외부 테이블의 Primary Key를 간혹 제대로 못 가져올 경우가 있다. 그럴 경우, 생성된 모델의 필드에 primary_key=True를 추가해줘야 한다.
  3. 가지고 온 외부 테이블 구조를 변경하고 싶다면 Meta 클래스의 managed=FalseTrue로 바꿔주면 된다.
%23%23%23%5BDjango%5DDjango%uC758%20Inspectdb%uC744%20%uC774%uC6A9%uD574%20%uC678%uBD80%20DB%uC5D0%20%uB300%uD574%20ORM%uB97C%20%uC368%uBCF4%uC790%21%0A@%28Django%29%5Bdjango%2C%20inspectdb%2C%20migrate%5D%0A%0ADjango%uB97C%20%uD558%uB2E4%uBCF4%uBA74%20%uC678%uBD80%20DB%uC758%20%uC815%uBCF4%uB97C%20%uAC00%uC838%uC640%uC11C%20%uC0AC%uC6A9%uD574%uC57C%uD560%20%uACBD%uC6B0%uAC00%20%uC788%uB294%uB370%20sql%uBB38%uC73C%uB85C%20%uC678%uBD80%20DB%uB97C%20%uAC00%uC838%uC624%uAE30%uC5D0%uB294%20%uC7A5%uACE0%uC758%20ORM%uAE30%uB2A5%uC774%20%uB108%uBB34%20%uC544%uAE4C%uC6B8%uB54C%uAC00%20%uC788%uB2E4.%0A%0ADjango%uC5D0%uC11C%uB294%20%uB2E4%uD589%uD788%uB3C4%20%uC678%uBD80%20DB%uC5D0%20%uB300%uD574%20**inspectdb**%uB77C%uB294%20%uAE30%uB2A5%uC744%20%uC81C%uACF5%uD558%uACE0%20%uC788%uB2E4.%20**inspectdb**%uB97C%20%uC0AC%uC6A9%uD558%uBA74%20%uC2E4%uC81C%20DB%uB97C%20%uB9CC%uB4E4%uC9C0%uB294%20%uC54A%uACE0%20%uC678%uBD80%20DB%uB97C%20%uAC00%uC838%uC640%20model%uB85C%20%uB9CC%uB4E4%uC5B4%uC8FC%uB294%20%uC815%uB9D0%20%uD3B8%uB9AC%uD55C%20%uAE30%uB2A5%uC774%uB2E4.%0A%0A%uAE30%uBCF8%uC801%uC73C%uB85C%20**inspectdb**%uB97C%20%uC0AC%uC6A9%uD560%uB824%uBA74%20%uC678%uBD80%20DB%uC5D0%20%uB300%uD55C%20%uC811%uC18D%20%uC815%uBCF4%uAC00%20%uC788%uC5B4%uC57C%uD55C%uB2E4.%20%uC774%uB294%20%60settings.py%60%uC758%20***DATABASE***%uB97C%20%uC124%uC815%uD574%uC8FC%uBA74%20%uB41C%uB2E4.%20%uC7A5%uACE0%uB97C%20%uCC98%uC74C%20%uC0DD%uC131%uD558%uBA74%20***DATABASE***%uAC00%20%60default%60%uB85C%20%uB418%uC5B4%20%uC788%uC744%20%uAC83%uC774%uB2E4.%20%uC5EC%uAE30%uC5D0%20%uC6D0%uD558%uB294%20%uC774%uB984%uC758%20%uC678%uBD80%20DB%20%uC811%uC18D%20%uC815%uBCF4%uB97C%20%uB123%uC5B4%uC8FC%uBA74%20%uB41C%uB2E4.%0A%0A%60%60%60python%0A%23%20settings.py%0ADATABASES%20%3D%20%7B%0A%20%20%20%20%27default%27%3A%20%7B%0A%20%20%20%20%20%20%20%20%27ENGINE%27%3A%20%27django.db.backends.mysql%27%2C%0A%20%20%20%20%20%20%20%20%27NAME%27%3A%20%27%3Cdefault_database%3E%27%2C%0A%20%20%20%20%20%20%20%20%27USER%27%3A%20%27%3Cdefault_useranme%3E%27%2C%0A%20%20%20%20%20%20%20%20%27PASSWORD%27%3A%20%27%3Cdefault_password%3E%27%2C%0A%20%20%20%20%20%20%20%20%27HOST%27%3A%20%27%3Cdefault_db_host_url%3E%27%2C%0A%20%20%20%20%20%20%20%20%27PORT%27%3A%20%273306%27%0A%20%20%20%20%7D%2C%0A%20%20%20%20%27external%27%3A%20%7B%0A%20%20%20%20%20%20%20%20%27ENGINE%27%3A%20%27django.db.backends.mysql%27%2C%0A%20%20%20%20%20%20%20%20%27NAME%27%3A%20%27%3Cexternal_database%3E%27%2C%0A%20%20%20%20%20%20%20%20%27USER%27%3A%20%27%3Cexternal_username%3E%27%2C%0A%20%20%20%20%20%20%20%20%27PASSWORD%27%3A%20%27%3Cexternal_password%3E%27%2C%0A%20%20%20%20%20%20%20%20%27HOST%27%3A%20%27%3Cexternal_db_host_url%3E%27%2C%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%uC5EC%uAE30%uC11C%20%60external%60%uC774%uB77C%uB294%20%uC774%uB984%uC73C%uB85C%20%uCD94%uAC00%uB97C%20%uD588%uB294%uB370%20%uC774%uB984%uC740%20%uB9C8%uC74C%uB300%uB85C%20%uC9C0%uC5B4%uB3C4%20%uB41C%uB2E4.%0A%0A%uC774%uC81C%20**inspectdb**%uB97C%20%uC0AC%uC6A9%uD574%uBCF4%uC790.%20%60users%60%uB77C%uB294%20%uC571%20%uC548%uC5D0%20models.py%uC5D0%20%uC800%uC7A5%uD558%uB3C4%uB85D%20%uD574%uBCF4%uC790.%0A%60%60%60bash%0A%24%20python%20manage.py%20inspectdb%20%3E%20%27users/models.py%27%20--database%20%27external%27%0A%60%60%60%0A%uC774%uB807%uAC8C%20%uD558%uBA74%20%60users%60%20%uC571%20%uC548%uC758%20%60models.py%60%uC5D0%20%uC678%uBD80%20Table%uC774%20model%20%uD615%uD0DC%uB85C%20%uC774%uC058%uAC8C%20%uC800%uC7A5%uB418%uC5B4%20%uC788%uC744%20%uAC83%uC774%uB2E4.%0A%uC774%uB807%uAC8C%20%uAC00%uC838%uC628%20Table%uB97C%20ORM%uC73C%uB85C%20%uC0AC%uC6A9%uD558%uAE30%20%uC704%uD574%uC11C%uB294%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uD558%uBA74%20%uB429%uB2C8%uB2E4.%20MyUser%uB77C%uB294%20%uBAA8%uB378%uC740%20%uC678%uBD80%20DB%uC5D0%20%uC788%uB294%20%uD14C%uC774%uBE14%20%uBA85%uC73C%uB85C%20**inspectdb**%20%uBA85%uB839%uC5B4%uB85C%20%uD1B5%uD574%20%uC790%uB3D9%20%uC0DD%uC131%uB41C%20%uBAA8%uB378%uC774%uB2E4.%0A%0A%60%60%60python%0A%23%20users/views.py%0Afrom%20users.models%20import%20MyUser%0A%23%20using%uC744%20%uC774%uC6A9%uD574%20%uC55E%uC11C%20%uC124%uC815%uD55C%20external%20%uC774%uB984%uC744%20%uB123%uC5B4%uC8FC%uBA74%20%uB41C%uB2E4.%0Aqueryset%20%3D%20MyUser.objects.using%28%27external%27%29.all%28%29%0A%60%60%60%0A%0A**inspectdb**%uB294%20%uC5C4%uCCAD%20%uD3B8%uB9AC%uD55C%20%uAE30%uB2A5%uC774%uAE34%20%uD558%uC9C0%uB9CC%20%uBA87%uAC00%uC9C0%20%uC8FC%uC758%uD574%uC57C%uD560%20%uC810%uC774%20%uC788%uB2E4.%0A%0A1.%20%uAE30%uBCF8%uC801%uC73C%uB85C%20%uAD00%uACC4%uD615%20%uD14C%uC774%uBE14%uB9CC%20%uAC00%uB2A5%uD558%uB2E4.%20%uD558%uC9C0%uB9CC%20**MySql**%uC758%20%60%20bit%20%uD0C0%uC785%uC740%20%uC81C%uB300%uB85C%20%uAC00%uC9C0%uACE0%20%uC624%uC9C0%20%uBABB%uD558%uB294%20%uB4F1%20%uC5EC%uB7EC%20%uBB38%uC81C%uAC00%20%uC788%uAE34%20%uD558%uB2E4.%0A2.%20%20%uC678%uBD80%20%uD14C%uC774%uBE14%uC758%20Primary%20Key%uB97C%20%uAC04%uD639%20%uC81C%uB300%uB85C%20%uBABB%20%uAC00%uC838%uC62C%20%uACBD%uC6B0%uAC00%20%uC788%uB2E4.%20%uADF8%uB7F4%20%uACBD%uC6B0%2C%20%uC0DD%uC131%uB41C%20%uBAA8%uB378%uC758%20%uD544%uB4DC%uC5D0%20%60primary_key%3DTrue%60%uB97C%20%uCD94%uAC00%uD574%uC918%uC57C%20%uD55C%uB2E4.%0A3.%20%20%uAC00%uC9C0%uACE0%20%uC628%20%uC678%uBD80%20%uD14C%uC774%uBE14%20%uAD6C%uC870%uB97C%20%uBCC0%uACBD%uD558%uACE0%20%uC2F6%uB2E4%uBA74%20Meta%20%uD074%uB798%uC2A4%uC758%20%60managed%3DFalse%60%uB97C%20%60True%60%uB85C%20%uBC14%uAFD4%uC8FC%uBA74%20%uB41C%uB2E4.%0A