DB의 데이터를 데이터프레임으로 저장해서 딕셔너리로 바꾸는건 큰 오버헤드 발생할 수 있음.
-> 데이터프레임을 CSV 형태로 리액트에 전달하자
flask서버와 postgreSQL을 연동하기
먼저 "점프 투 플라스크"를 참고하여 flask와 DB를 다루는데에 익숙해지도록 한다.
project
| |__pybo
| |__ __init__.py : db, Migrate() 인스턴스 생성, 애플리케이션 팩토리 정의
| |__models.py : 데이터베이스 처리
| |__forms.py : 서버로 전송된 폼 처리
| |__views : 화면구성 디렉토리
| |__static : css,자바스크립트, 이미지 파일 등 정적 파일 저장 디렉토리
| |__templates : html파일 저장 디렉토리
|__config.py : 프로젝트 설정
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)
플라스크는 어플리케이션 컴포넌트를 만들고 어플리케이션 내부나 어플리케이션간에 공통 패턴을 지원하기 위해 블루프린트(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을 연결하여 데이터 가져오기
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"