[ErrorCatcher 5] Multiple databases

LILO Ghim·2022년 1월 3일
0
post-thumbnail

아니 뭐 db는 하나만 써봤죠?
아니 왜 안 가르쳐 줬어여,,,,,?

inspectdb


이미 갖춰진 table을 불러와서 migration, migrate 없이 사용 할 수도,
또, db를 여러 개 사용할 수도 있다는 건 아주 당연한건데

왜 단 한번도 궁금해 하지 않았지!

db를 덤프 떠서 다시 넣어 사용을 해봤으면 아주 자연스럽게 궁금할 수도 있지 않았을까?

ㅗㅐ?

python manage.py inspectdb --database service strategy > models.py
python manage.py inspectdb > 'app/models.py' --database service strategy

이렇게 이미 사용되고 있는 db의 table을 불러오면 models.py가 자동으로 생긴다.

그럼 migration을 해도 migration file이 생기지 않고 그대로 쓰면 된다.
그리고 migrate를 해도 아래와 같이,

class Meta:
        managed    = False

managed = False option 때문에,
django는 해당하는 model을 수정하거나, 지우거나, 새로 만들거나 하지 않는다.
당연히 수정이 필요하다면 managed = True로 설정해주면 된다.
공식문서링크


하지만!

에러캐쳐는 또! 그냥 넘어가는 법이 없지!

이렇게 있지도 않은 id를 계속 찾고,,,,,
아니 field가 없는데, migration 파일도 없는데??? db에는 당연히 없는데?

구글링과 삽질을 하루 종일 하다가 결국 migration을 해보는데,,,
아니 원래 migration을 하면 파일이 안 생겨야 되는데
아주 자연스럽게 migration과 migrate가 되면서,,,,,

id field가 생겼고, models.py에는 id가 없고, db에도 당연히 없고 흫
당연히 managed=False이니 model과 db는 그대로

stackoverflow 형님들께서는
id column(primary_key=True)을 넣어주라고 하셨고,
아니 이게 내 db면 진작 드뢉디비 하고, migration 싹 날렸지 흫

결론은, primary_key=True

  • django는 migration 할 때 자동으로 id field를 만들어 주는데(models.py작성할 때, id field를 만들지 않아도 db에 생성 되어 있는 것처럼!)
  • inspectdb를 할 때, 꼭! primary_key=True를 꼭 가지고 있는! table을 넣어줘야 하는 것인데,
  • 내가 inspectdb한 table에 pk역할을 하는 column이 애초에 없었던 것
  • 여기까진 어떻게 생각이 흘렀는데, 그 다음 진행을 할 수가 없었지 흫_


새로운 table을 inspectdb 하면서 내 20시간의 고민은 해결이 되었다
내 주말.... 흫


Multiple databases


사실 db 경로를 못찾는 error가 먼저였고,
id를 찾아 헤매는 error가 그 다음이었다.

django.db.utils.programmingerror (1146 table doesn't exist)


db setting이 여러 개이다 보니,
default, 기타 등등이 있는데,
default로 가서 또 table을 찾아 해매지

컴퓨터는 거짓말을 하지 않지

내 잘못이지. 응 이건 좀 이해가 되. 어느 db를 가라고 내가 말 안해줬지


multiple databases라는 keyword를 쉽게(?)찾고, 공식문서많이봤지

방법은 두 가지

  • dbrouter.py (안끌림. 끌려야 되는데 안끌림)

  • Manually selecting (뭔가 끌림. 끌리면 안되는데 끌림)

일단 그래야 할 것 처럼, dbrouter.py을 작성하면 된다

작성을 하다가 공식문서를 한 번 쭉 내리면
왠지 끌리는 수동으로 설정하는 방법이 나온다. 직접 콕 찍어주는 방법

strategy = Strategy.objects.using('db name').all()

dbrouter.py를 쓰는 것보다 우선하고(공식문서에 의하면?),
아~주 직관적이지만, 관리적인 측면에서, 그리고 또 더러운 코드가 되므로
쓰다만 router를 마저 쓰도록 하지

참고한 블로그

settings에 꼭 세팅하고(common.py에 setting 함)

DATABASE_ROUTERS = (
    'rim_project.apps.dbrouter.MultiDBRouter',
)

설정을 전부 다 마치고 나면,


에러가 또 나지!
아, OhTha,,,,,였지,,,,,흫


즐거운 에러캐쳐

profile
킴릴로

0개의 댓글