Q&A

책을 따라하다가 막히는 부분이 있나요?
질문을 남겨주세요.

교재 p610 makemigrations 질문드립니다.

3 years, 5 months ago

daehoon daehoon

안녕하세요, 작가님.

집필하신 교재 재밌게 잘 보고 있습니다.

교재를 보던 중 p610, 'sudo docker-compose exec web python manage.py makemigrations' 부분에서 계속해서

오류가 발생하여 여쭤봅니다.


현재 디렉토리에 존재하는 폴더들은 아래와 같습니다.

.env.dev   .env.prod.db  .gitignore  README.md  _static  django_prj              docker-compose.yml  nginx             single_pages
.env.prod  .git          Dockerfile  _media     blog     docker-compose.dev.yml  manage.py           requirements.txt


.env.prod 파일 내부 내용입니다.

DEBUG=0
SECRET_KEY=[본인의 secret key]
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [공인 IP] [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=do_it_django_prod
SQL_USER=do_it_django_db_user
SQL_PASSWORD=do_it_django_db_password
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgres


.env.prod.db 파일 내부 내용입니다.

POSTGRES_USER=do_it_django_db_user
POSTGRES_PASSWORD=do_it_django_db_password
POSTGRES_DB=do_it_django_prod


위 두 파일의 내용과 관련이 있나 싶어 노랗게 하이라이트한 부분 재확인 해보았는데 결과는 동일했습니다.

책에 나온 user와 password를 그대로 활용했습니다.

p610의 'sudo docker-compose exec web python manage.py makemigrations'를 실행하자

아래와 같은 에러메시지가 발생했습니다.


Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  role "do_it_django_db_user" does not exist


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py", line 101, in handle
    loader.check_consistent_history(connection)
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 290, in check_consistent_history
    applied = recorder.applied_migrations()
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
    if self.has_table():
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 55, in has_table
    with self.connection.cursor() as cursor:
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 259, in cursor
    return self._cursor()
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 235, in _cursor
    self.ensure_connection()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: FATAL:  role "do_it_django_db_user" does not exist


do_it_django_db_user와 관련해서 파일 간 연결에 문제가 있어서 그런 거 같은데

작가님의 의견을 여쭙고 싶습니다.

감사합니다.


taegon
taegon   3 years, 5 months ago

안녕하세요.

독자님께서 문제는 정확히 짚으신 것 같습니다. 데이터베이스 접속이 되지 않아서 발생하는 에러로 보이는데요. 혹시 docker-compose.yml 파일도 공유해주실 수 있을까요? 일단 의심스러운 부분은 db 컨테이너를 만드는 과정에서 .env.prod.db의 설정 정보를 이용해서 생성해야 하는데, 이 부분이 제대로 설정되는지는 살펴보려고 합니다. 일단 에러메시지가 출력되는 것을 보면, web 컨테이너, 즉 장고 측에서는 지정한 데이터베이스로 접근을 시도하려는 것으로 보입니다.

아니면 작업하고 계신 깃헙 저장소를 공유해주시면, 제가 직접 테스트해보고 답변 드릴 수 있기도 하구요. 공개가 부담스러우시면, 제 깃헙 계정이 taegon 입니다. private 저장소에 제 계정을 추가해주세요.

고맙습니다.

Updated: May 22, 2021, 2:08 p.m.

daehoon
daehoon   3 years, 5 months ago

docker-compose.yml 파일

version: '3'

services:
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_mdeia
    ports:
      - 80:80
    depends_on:
      - web
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    command: gunicorn django_prj.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_media
      - ./:/usr/src/app/
    expose:
      - 8000
    env_file:
      - ./.env.prod
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db
volumes:
  postgres_data:
  static_volume:
  media_volume:

github: hunimoda/django


말씀하신 docker-compose.yml 파일과 깃헙입니다.

감사합니다, 작가님.

Updated: May 24, 2021, 11:46 a.m.

sungyong
sungyong   3 years, 5 months ago

안녕하세요. 독자님. 

.env.prod 에 있는 내용과 현재, docker-compose.yml 내용이 일치하는지 확인해보세요. 

지금은 .env.prod가 커밋+푸시 되어 있지 않아서 판단하기가 어렵습니다. 

Updated: May 25, 2021, 1:14 a.m.

taegon
taegon   3 years, 5 months ago

안녕하세요.

아마 이전 작업에 데이터베이스가 생성이 되어서 볼륨에 저장되어 있는 게 아닌가 추정됩니다. 현재 올려주신 github 소스와 이 글에 첨부해주신 설정 파일로 작업해본 바 문제 없이 실행이 되는 것을 확인하였습니다.

데이터베이스에 중요한 자료가 없다면 (혹은 현재 책을 따라하고 계시다면), 데이터베이스를 지우셔도 문제가 없을 겁니다. 아래 명령으로 할당된 모든 볼륨을 지울 수 있으므로, 볼륨을 지운 후, 도커를 다시 빌드해보시기 바랍니다.

 docker volume prune

이후에 볼륨이 지워진 이후, 빌드를 하면 빈 저장소가 생성되어, makemigrations, migrate 등이 정상적으로 동작할 것입니다.

혹시나 문제가 계속 되시면 다시 글 남겨주세요.

고맙습니다.


Updated: May 25, 2021, 12:31 p.m.

2KNG
2KNG   2 years, 8 months ago

안녕하십니까

비슷한 문제가 발생하여 이 글을 참조하여 시도해보았지만, 

문제가 해결되지않아

docker-compose down -v 

명령어를 실행한 후

docker volume prune

으로 날려주니 해결되었습니다.


이 글과 작가님 코맨트를 참고하여 블로그에 해결방법을 남겨놓았습니다.(혹시 몰라 링크는 따로 하지않았습니다.)

https://blog.naver.com/khkim1207/222638522508

문제가 된다면 삭제하도록 하겠습니다.

강의는 정말 잘 보고있습니다. 감사합니다!

Updated: Feb. 4, 2022, 10:52 a.m.

Leave a Comment:
목록보기
Search
  • 자유게시판
  • Q&A