Blog project
SQLAlchmy
"개발자들은 게으름을 지향합니다."
언뜻 이해가 되지 않는 명제이기도 합니다. 흔히 개발자 (혹은 프로그래머)를 떠올리면 일반인들에게는 정해진 심상이 있습니다. 영화나 드라마를 통해 낮밤없이 일하는 사람을 떠올리게 됩니다. 아무도 보지 않는 어두운 방에 홀로 앉아 누구와도 이야기 하지 않고 무섭게 키보드를 두들기는 사람 같은 느낌입니다. 하지만 대부분의 개발자는 깔끔하게 차려입고 회사에 출근하여 정해진 시간동안 특정한 문제를 해결하거나 기능들을 개선 혹은 개발 합니다. 물론 전통적인 제조업 보다는 규율에서 자유롭지만 그 것은 효율성을 위한 선택일뿐 입니다. 어떤 회사에서는 그런 자율마저 주어지지 않는 회사도 많이 있습니다. 그 어떤 경우든 밤낮없이 일하는 모습으로 그려집니다.
그런 조직에 속해 있는 개발자들도 혹은 프리랜서 처럼 혼자 일하는 분들도 반복작업을 싫어 합니다. 물론 놀이로 컴퓨터를 가지고 노는 것은 즐겁습니다. 하지만 일을 위해서 코딩을 하는 것은 고통에 가깝습니다. 그것은 저도 마찬가지 입니다. 그리고 그런 반복적인 코드가 제작중 혹은 개선중인 제품에 입력되는것도 싫어 합니다. 이를 간단하게 줄여 DRY(Do not Repeat Yourself)라고 합니다.
이런 DRY원칙은 데이터베이스를 구성함에도 마찬가지 입니다. 필연적으로 DB(앞으로 데이터 베이스를 이렇게 줄여서 말하겠습니다.)는 쓰기와 읽기를 반복해야 합니다. 그 반복하는 횟수 만큼 코드가 길어질 수 밖에 없습니다. 이런 반복을 피하기 위해 뛰어난 개발자 분들께서 만들어 놓은 도구가 “SQLAlchemy” 입니다.
프로그램 개발을 조금이라도 공부한 분이라면 class를 접해 보셨을 겁니다. (혹시 모르는 분이시라면 생활코딩 혹은 유튜브에 많은 설명이 공개되어 있으니 참고하시기 바랍니다. ) 이 라이브러리는 class의 개념을 도입하여 DB의 CRUD(Create , Read, Update, Delete)를 이해하기 쉽게 해줍니다.
제가 블로그를 만들면서 사용한 코드는 다음과 같습니다.
새로운 데이터베이스 만들기
from flask_sqlalchemy
import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///posts.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
새로운 데이터베이스 테이블 만들기
class BlogPost(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(250), unique=True, nullable=False)
subtitle = db.Column(db.String(250), nullable=False)
date = db.Column(db.String(250), nullable=False)
body = db.Column(db.Text, nullable=False)
author = db.Column(db.String(250), nullable=False)
img_url = db.Column(db.String(250), nullable=False)
root 라우트에서 모든 블로그 포트스 읽어서 index.html로 보내주기
@app.route('/')
def get_all_posts():
posts = BlogPost.query.all()
return render_template("index.html", all_posts=posts)
edit-post 라우트 에서 기존의 입력을 가져와서 수정한 뒤 업데이트 하기
@app.route("/edit-post/<int:post_id>", methods=["GET", "POST"])
def edit_post(post_id):
post = BlogPost.query.get(post_id)
edit_form = CreatePostForm(
title=post.title,
subtitle=post.subtitle,
img_url=post.img_url,
author=post.author,
body=post.body
)
if edit_form.validate_on_submit():
post.title = edit_form.title.data
post.subtitle = edit_form.subtitle.data
post.img_url = edit_form.img_url.data
post.author = edit_form.author.data
post.body = edit_form.body.data
db.session.commit()
return redirect(url_for("show_post", post_id=post.id))
return render_template("make-post.html", form=edit_form, is_edit=True)
delete 라우트에서 특정 포스트의 아이디를 기준으로 삭제하기
@app.route("/delete/<int:post_id>")
def delete_post(post_id):
post_to_delete = BlogPost.query.get(post_id)
db.session.delete(post_to_delete)
db.session.commit()
return redirect(url_for('get_all_posts'))
위와 같이 간단하게 블로그의 포스트를 작성 ,읽기, 수정, 삭제하는 라우터를 만들어 보았습니다. 다음 글에서는 HTML에 다양한 form 을 기본적으로 제공해주는 wtforms를 알아 보겠습니다.
2021/02/16 - [Toy Project/Python] - Blog project - Databas
2021/02/04 - [Toy Project/Python] - Blog project - Bootstrap
2021/02/03 - [Toy Project/Python] - Blog project - Front-end
2021/02/02 - [Toy Project/Python] - Blog project - Back_end
2021/02/01 - [Toy Project/Python] - Blog Project - Start
'Project > Python' 카테고리의 다른 글
Blog project - Login (0) | 2021.03.31 |
---|---|
Blogproject - Flask-wtf (0) | 2021.03.18 |
Blog project - Database (0) | 2021.02.16 |
Blog project - GET/POST (0) | 2021.02.05 |
Blog project - Bootstrap (0) | 2021.02.04 |