Flask와 postgreSQL 연동하기

손호준·2022년 11월 30일
0

프로젝트 관련 사항

  • DB의 데이터를 데이터프레임으로 저장해서 딕셔너리로 바꾸는건 큰 오버헤드 발생할 수 있음.
    -> 데이터프레임을 CSV 형태로 리액트에 전달하자

  • flask서버와 postgreSQL을 연동하기

먼저 "점프 투 플라스크"를 참고하여 flask와 DB를 다루는데에 익숙해지도록 한다.

질문게시판 구현하기

1. pybo 프로젝트 구조

project
|	|__pybo
|		|__ __init__.py : db, Migrate() 인스턴스 생성, 애플리케이션 팩토리 정의
|		|__models.py : 데이터베이스 처리
|		|__forms.py : 서버로 전송된 폼 처리
|		|__views : 화면구성 디렉토리
|		|__static : css,자바스크립트, 이미지 파일 등 정적 파일 저장 디렉토리
|		|__templates : html파일 저장 디렉토리
|__config.py : 프로젝트 설정

2. 데이터베이스 : SQLite

  • SQL쿼리문 대신 파이썬 ORM사용 (SQLAlchemy 라이브러리 사용)

ORM이란 Object-relational mapping의 약자로 객체와 관계형 데이터베이스를 매핑해주는 툴이다.
참고 사이트 : https://eun-jeong.tistory.com/31, https://hanamon.kr/orm%EC%9D%B4%EB%9E%80-nodejs-lib-sequelize-%EC%86%8C%EA%B0%9C/

## __init__.py ##
from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
import config

db = SQLAlchemy()
migrate = Migrate()

def create_app(): # 애플리케이션 팩토리
    app = Flask(__name__)
    app.config.from_object(config)

    # ORM
    db.init_app(app)
    migrate.init_app(app, db)
    from . import models

    ### 중략 ###
## models.py ##
from pybo import db

class Question(db.Model):
    id = db.Column(db.Integer, primary_key=True) # id 속성을 기본 키(Primary Key)로 만듦
    subject = db.Column(db.String(200), nullable=False) # nullable은 빈값 허용할지 여부, False면 허용x
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)

class Answer(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    question_id = db.Column(db.Integer, db.ForeignKey('question.id', ondelete='CASCADE'))
    question = db.relationship('Question', backref=db.backref('answer_set'))
    content = db.Column(db.Text(), nullable=False)
    create_date = db.Column(db.DateTime(), nullable=False)

3. blueprint

플라스크는 어플리케이션 컴포넌트를 만들고 어플리케이션 내부나 어플리케이션간에 공통 패턴을 지원하기 위해 블루프린트(blueprint) 라는 개념을 사용한다. 블루프린트는 보통 대형 어플리케이션이 동작하는 방식을 단순화하고 어플리케이션의 동작을 등록하기 위한 플라스크 확장에 대한 중앙 집중된 수단을 제공할 수 있다. Blueprint 객체는 Flask 어플리케이션 객체와 유사하게 동작하지만 실제로 어플리케이션은 아니다. 다만 어플리케이션을 생성하거나 확장하는 방식에 대한 블루프린트 이다.

## question_views.py ##
from flask import Blueprint

# 블루프린트 생성
bp = Blueprint('question', __name__, url_prefix='/question')

# 데코레이터와 함수를 연결할 때 블루프린트는 어플리케이션에 있는 그 함수를 등록하겠다는 의도를 기록
@bp.route('/list/')
def _list():
	### 중략 ###
## __init__.py ##
### 중략 ###
# 블루프린트 등록
    from .views import main_views, question_views, answer_views
    app.register_blueprint(main_views.bp)
    app.register_blueprint(question_views.bp)
    app.register_blueprint(answer_views.bp)

flask서버와 postgreSQL 연동하기

postgreSQL 이란?

  • 오픈 소스 ORDBMS로 관계형 DBMS의 기본적인 기능인 트랜잭션과 ACID(Atomicity, Consistency, Isolation, Durability)를 지원, MySQL보다 표준을 더 잘 지원함

설치가 필요한 툴들

  • postgreSQL
  • pgadmin4 : postgreSQL을 관리하기 쉽게 GUI환경을 제공하는 툴
  • psycopg2 : 파이썬에서 postgreSQL을 사용할 수 있게 해주는 커넥터(라이브러리). postgreSQL에 접근해서 데이터 읽고 쓰기 가능해짐.

## flask와 postgreSQL을 연결하여 데이터 가져오기 

from flask import Flask, make_response, Response, request
from datetime import datetime, date, timedelta
import psycopg2
import pandas as pd

app = Flask(__name__)
app.debug = True

# 커넥션 만들기 (파이썬과 포스트그레스 connect)
conn = psycopg2.connect(host='localhost',dbname='mydb',user='postgres',password=1234567,port='5432')

# 커서 만들기
# 커서 객체는 실질적으로 DB에 쿼리문을 수행하고, 결과를 가져오는 역할을 함
cur = conn.cursor()

# 커서로 쿼리문 수행
#cur.execute('INSERT INTO f1_fasoo (id, name, task_name, create_date, working_time) VALUES (3, \'손호준\', \'인턴 프로젝트\', \'2022-12-01\', 24)')
cur.execute('SELECT * FROM public.f1_fasoo')

# 포스트그레스로 값을 전달하려면 커밋
# conn.commit()

# execute는 말 그대로 쿼리문을 실행하는 것. 실제로 해당 트랜잭션이 수행되려면 commit을 통해 DB에 반영해야 한다.

# 커서로 결과 가져와서 info에 저장
info = cur.fetchall()
df = pd.DataFrame(info)
print(df)

#db접근 끝나면 커서와 커넥션을 닫아줌
cur.close()
conn.close()

@app.route("/")
def f1_server():
    return "f1_server run"
profile
Rustacean🦀/Data engineer💻

0개의 댓글