본문 바로가기

학과공부

[데이터베이스] 과제를 위한 백엔드 공부 with flask - final

question

question = db.relationship('Question', backref=db.backref('answer_set'))

그 다음 question 속성은 답변 모델에서 질문 모델을 참조하기 위해 추가했다.

위와 같이 db.relationship으로 question 속성을 생성하면

답변 모델에서 연결된 질문 모델의 제목을 answer.question.subject처럼 참조할 수 있다.

 

db.relationship의 첫 번째 파라미터는 참조할 모델명이고

두 번째 backref 파라미터는 역참조 설정이다.

역참조란 쉽게 말해 질문에서 답변을 거꾸로 참조하는 것을 의미한다.

한 질문에는 여러 개의 답변이 달릴 수 있는데,

역참조는 이 질문에 달린 답변들을 참조할 수 있게 한다.

예를 들어 어떤 질문에 해당하는 객체가 a_question이라면,
 
a_question.answer_set와 같은 코드로 해당 질문에 달린 답변들을 참조할 수 있다.

 

SQLAlchemy에서 제공하는 속성은 위에서 소개한 것 외에도 많이 있다.

자세한 내용은 다음의 URL을 참고하자.

 

Column and Data Types — SQLAlchemy 1.3 Documentation

Column and Data Types SQLAlchemy provides abstractions for most common database data types, and a mechanism for specifying your own custom data types. The methods and attributes of type objects are rarely used directly. Type objects are supplied to Table d

docs.sqlalchemy.org

지금까지 설명한 것들을 머리로만 이해하려고 하면 어려울 것이다.

곧이어 실습을 진행할 것이니 대략적인 개념만 숙지하고 넘어가도록 하자.

 

 

모델을 구상하고 생성했으므로 플라스크의 migrate 기능을 이용해 데이터베이스 테이블을 생성해 보자.

앞에서 작성한 모델을 플라스크의 migrate 기능이 인식하려면 다음과 같은 import 과정이 필요하다.

 

그리고 명령 프롬프트에서 flask db migrate 명령을 수행하자.

이 명령을 수행하면 d537d1201b4d_.py처럼 데이터베이스 변경 작업을 위한 리비전 파일이 생성된다.

리비전(revision)이란 생성된 d537d1201b4d_.py 파일에서 

.py 확장자를 제외한 d537d1201b4d_와 같은 버전 번호를 가리킨다.

리비전은 flask db migrate 명령을 수행할 때 무작위로 만들어진다.

 

이어서 flask db upgrade 명령으로 만들어진 리비전 파일을 실행하자.

(리비전 파일 내에는 테이블 생성을 위한 쿼리문들이 저장되어 있다.)

 

이 과정에서 데이터베이스에 모델 이름과 똑같은 question과 answer라는 이름의 테이블이 생성된다.

지금까지 잘 따라왔다면 projects/myproject 디렉터리에 pybo.db 파일이 생성되었을 것이다.

pybo.db가 바로 SQLite 데이터베이스의 데이터 파일이다.

 

 

pybo.db 데이터 파일에 정말로 question과 answer 테이블이 생성되었는지 확인해 보자.

이를 위해 SQLite의 GUI 도구인 DB Browser for SQLite를 사용해 보자.

 

https://sqlitebrowser.org/dl 에 접속한 다음

DB Browser for SQLite(이하 DB 브라우저) 설치 파일(standard installer)을 내려받아 설치를 진행하자.

(필자는 이미 설치되어 있어서 설치과정은 생략한다)

 

 

확인해보면 잘 있다

 

모델도 만들었고 모델을 기반으로 테이블도 생성했으니

이제 모델을 사용할 차례다.

"플라스크 셸"을 사용해 모델 사용법을 간단히 익혀보자.

플라스크 셸은 명령 프롬프트에서 flask shell 명령으로 실행한다.

 

다음으로 Question 모델 객체를 하나 생성하자

Question 모델의 create_date 속성은 DateTime 유형이므로 

datetime.now 함수로 현재 일시를 대입했다. 하지만 객체 q를 만들었다고 해서

데이터베이스에 질문 데이터가 저장되는 것은 아니다.
데이터베이스에 데이터를 저장하려면 다음처럼 SQLAlchemy의 db 객체를 사용해야 한다.

코드에서 보듯 신규 데이터를 저장할 때는 db.session의 add 함수를 사용한 다음

commit 함수까지 실행해야 한다. 

db.session은 데이터베이스와 연결된 세션,

즉 접속된 상태를 의미한다.

데이터베이스를 처리하려면 이 세션이 필요하다.

그리고 세션을 통해서 데이터를 저장, 수정, 삭제 작업을 한 다음에는

반드시 db.session.commit()으로 커밋을 해주어야 한다.

커밋을 해야 비로서 데이터베이스에 데이터가 저장된다.

 

데이터가 잘 생성되었는지 확인해 보자.

id는 Question 모델의 기본 키다.

id는 앞에서 모델을 생성할 때 설정했던대로

데이터를 생성할 때 속성값이 자동으로 1씩 증가한다.

정말 그런지 두 번째 질문 데이터를 생성한 후 id를 확인해 보자.

commit 까지 해줘야 비로서 db에 저장되는 모습을 볼 수 있고

결과를 보면 두 번째 질문 데이터의 id는 예상대로 2가 출력된 것을 볼 수 있다

 

이번에는 데이터베이스에 생성된 데이터를 조회해 보자

Question.query.all()로 데이터베이스에 저장된 질문을 전부 조회했다.

결과에서 보이는 숫자 1과 2는 Question 객체의 id 속성값이다.

 

이번에는 filter 함수를 이용해 첫 번째 질문만 조회해 보자.

ilter 함수는 인자로 전달한 조건에 맞는 데이터를 찾아서 반환한다.

여기서는 기본 키인 id를 이용했으므로 값을 1개만 반환한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처: https://wikidocs.net/81045

 

2-04 모델로 데이터 처리하기

* `[완성 소스]` : [github.com/pahkey/jump2flask/tree/2-04](https://github.com/pahkey/jump2flask/tree/2-…

wikidocs.net