기능 다듬기

Red_Panda·2021년 3월 29일
0

회원가입, 로그인, 로그아웃 기능을 만들어 이제 작성자가 누구인지 알 수 있다. 이를 이용하기 위해 모델을 다듬는다.


__init.py__ 파일을 수정해 제약 조건 이름을 MetaData 클래스를 사용해 규칙을 정의한다. 그러지 않으면 제약조건에 이름이 없다고 오류가 발생한다.

SQLite 데이터베이스는 render_as_batch 속성을 True로 지정해야 한다. False라면 제약 조건의 변경을 지원하지 않는다고 오류난다.

그리고 cmd에서 다음과 같이 데이터베이스를 변경해준다

(myproject) c:\projects\myproject>flask db migrate
(myproject) c:\projects\myproject>flask db upgrade


처음에 flask db migrate 실행할때 오류가 났다. 대상 데이터 베이스가 최신 상태가 아니라는데, 구글에서 해결 방법을 찾았다.
내 기준으로 가장 최신의 리비전파일은 6e30accbfc49.py인데 대상 데이터베이스가 33c83e165d86.py로 되어있어서 였다. 그래서 flask db stamp head 명령어를 통해 대상 데이터 베이스를 최신파일로 바꿔줬더니 데이터베이스 변경에 성공했다.

근데 밑에서 해당내용을 다룬다..


Question 모델에 user_id, user 필드 추가하기

user_id 필드는 User 모델 데이터의 id값을 Question 모델에 포함, user 필드는 Question 모델에서 User 모델을 참조하기 위함이다.

db.relationship함수의 backref는 User 모델 데이터를 통해 Question 모델 데이터를 참조할때 사용 한다.

(myproject) c:\projects\myproject>flask db migrate
(myproject) c:\projects\myproject>flask db upgrade

모델을 수정했으니 다시 리비전 파일을 생성해서, 적용하자. 근데 db upgrade에서 오류가 발생한다.

해결 하려면 아래와 같은 순서로 따라하라고 한다.

user_id의 nullable 설정을 False 대신 True로 바꾸기
user_id를 임의의 값으로 설정하기(여기서는 1로 설정)
flask db migrate 명령, flask db upgrade 명령 다시 실행하기
user_id의 nullable 설정을 다시 False로 변경하기
flask db migrate 명령, flask db upgrade 명령 다시 실행하기

flask db heads : migrate 작업의 최종 리비전
flask db current : 현재 시점의 리비전


최종리비전과 현재시점의 리비전이 다르면 migrate 작업을 할 수 없다. 2개의 리비전이 다른 이유는 migrate 이후에 upgrade를 실패했기 때문이다. 현재 리비전을 최종 리비전으로 변경하려면 위에서 말한
flask db stamp heads 명령어를 사용하면 된다.

db migrate, db upgrade가 끝나면 다시 코드를 원래대로 수정 후 같은 명령을 다시 수행한다.


Answer 모델도 같은 방법으로 user_id, user 필드를 추가하면 된다.

Question, Answer 모델에 user필드를 추가했으니, Question, Answer 기능에도 user필드를 반영시킨다.

그리고 로그인 후, 글을 작성하면 잘 된다. 그러나 로그아웃을 하면 글을 작성하면 오류가 난다. g.user가 None이기 때문이다.

그런데 나는 로그인을 하지 않아도 글을 쓸 수 있도록 할 것이기 때문에 로그인상태, 비로그인 상태 두 가지로 나눠 작성할 수 있도록 수정할 것이다.

profile
신입 개발자

0개의 댓글