Flask에서 PostgreSQL과 연계한 독서 기록부를 만들었다

소개



주말에 공부를 하면 조금 독서 기록부를 만들었습니다.
화면은 이쪽.


기능으로서는, 읽은 책을 등록하는 것과, 등록된 책의 리스트를 보는 정도입니다.

소스 코드



소스 코드는 다음과 같습니다. html은 본 채이므로 할애합니다.

app.py
from flask import Flask, render_template,url_for,request,redirect
from sqlalchemy import create_engine
import pandas
import psycopg2

'''
参考にしたサイト
https://tanuhack.com/pandas-postgres-readto/

'''

# PostgreSQLの接続情報
connection_config = {
    'user': 'user',
    'password': 'password',
    'host': 'localhost',
    'port': '5432',
    'database': 'mydb'
}

# psycopg2を使ったDB接続
connection = psycopg2.connect(**connection_config)

# dfの作成
df = pandas.read_sql(sql='SELECT * FROM books;', con=connection) 
header = ['id','書籍名','著者','読了日','評価']
record = df.values.tolist() # DataFrameのインデックスを含まない全レコードの2次元配列のリスト

app = Flask(__name__)

@app.route('/')
def index():
    #indexを読み込むたびにDBからのSELECT文更新
    df = pandas.read_sql(sql='SELECT * FROM books;', con=connection) 
    record = df.values.tolist()
    return render_template('index.html',  header=header, record=record)

@app.route('/result', methods=['GET','POST'])
def addition():
    if request.method == "POST":
        # レコード数再取得が必要
        df = pandas.read_sql(sql='SELECT * FROM books;', con=connection) 
        record = df.values.tolist() 

        # POSTの内容を元にINSERT文の値取得、idは現在のレコード数+1
        book_id = len(record)+1
        res1 = request.form['書籍名']
        res2 = request.form['著者']
        res3 = request.form['読了日']
        res4 = request.form['評価']
        dict1={'id':[book_id],'name':[res1],'writer':[res2],'read_day':[res3],'rank':[res4]}

        # DBに飛ばすにはSQLAlchemy必要
        engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{database}'.format(**connection_config))
        df = pandas.DataFrame(data=dict1)
        df.to_sql('books', con=engine, if_exists='append', index=False)
        return redirect(url_for('index'))

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

개요로는 PostgreSQL에 읽은 책의 테이블이 있어, SELECT문으로 DataFrame으로서 취득한 내용을 리스트화해, render_template로 index.html에 보내 「당신이 읽은 책」으로서 표시시킨다.
그리고 읽은 책의 등록은 입력 양식에 정보를 입력하고 등록 버튼을 눌러 POST 메소드로 처리됩니다. id는 최신 번호를 자동으로 할당하고, 그 외는 입력 폼으로부터 취득해, 1행의 사전형의 데이터를 작성합니다.
마지막으로 사전 형식의 데이터를 DataFrame으로 변환하고 df.to_sql에서 DB에 INSERT 문을 건너 뛰면 데이터가 추가됩니다.

도전



· 배포 할 수 없었습니다.
heroku를 사용하려고 했습니다만, 배포한 것이 잘 기동하지 않고 단념했습니다.
원인은 분명하지는 않지만, 원시 환경에서 한 것이 영향을 미칠 것 같았기 때문에 virtualenv를 사용해야했다고 생각합니다.

・기능 부족
보시다시피 데이터를 추가하는 기능 만 있습니다. 등록 정보를 수정하거나 지우고 싶으면 명령 프롬프트에서 직접 DB를 보러 가야 합니다.

미래를 향해



우선, 최소한 하고 싶었던 DB와 웹 페이지의 제휴(DB로부터의 취득과 DB에의 추기)는 할 수 있었기 때문에 급제점으로 버립니다.
다음은 독서 기록부를 리메이크할지 다른 것을 만들지 결정하고 있지 않습니다만, virtualenv를 사용해, 조금씩 heroku에 배포하는,라고 하는 작성 스타일로 하고 싶습니다.

좋은 웹페이지 즐겨찾기