データベースの設定 - Flask

準備

ライブラリのインストール

pip install sqlalchemy mysql-connector-python flask-sqlalchemy

ディレクトリ・ファイル構成

ディレクトリ構成

  • flask_app
    • controllers
      • myapp.py
    • models
      • user.py
    • static
      • css
        • style.css
      • js
        • scripts.js
    • templates
      • member
        • index.html
      • myapp
        • index.html
      • share
        • layout.html
    • __init__.py
    • app.py
    • config.py
    • database.py

ファイル

flask_app/config.py

class SystemConfig:
    DEBUG = True
    
    SQLALCHEMY_DATABASE_URI = 'mysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{
        'user': 'root',
        'password': 'password',
        'host': 'localhost',
        'db_name': 'sample'
    })

SQLALCHEMY_TRACK_MODIFICATIONS = "false"

Config = SystemConfig

flask_app/controllers/member.py

from flask import Blueprint, render_template, request, redirect
from ..models.user import User

member = Blueprint("member", __name__, url_prefix='/member')

@member.route('/')
def index():
    users = User.getAll()
    return render_template('member/index.html', users = users)

flask_app/__init__.py

from flask import Flask
from .database import db
from .config import *
from .controllers.myapp import myapp
from .controllers.member import member


def create_app():
    app = Flask(__name__)
    app.config.from_object(config.Config)
    db.init_app(app)

    app_name = [
        myapp,
        member
    ]

    for i in app_name:
        app.register_blueprint(i)
    
    return app

flask_app/models/user.py

from ..database import db

class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)
    age = db.Column(db.Integer, nullable=False)

    def getAll():
        return db.session.query(User).all()

flask_app/templates/member/index.html

{%- extends "./share/layout.html" %}
{%- block content %}
    <h1>Member/index.html</h1>
    <table>
        {% for user in users %}
        <tr>
            <td>{{user.id}}</td>
            <td>{{user.name}}</td>
            <td>{{user.age}}</td>
        </tr>
        {% endfor %}
    </table>
{%- endblock %}