演習課題「間違い探し:特定職業のプレイヤーインデックスを表示する」
右の環境には、SQLAlchemyとFlaskでMySQLで、特定職業ページにプレイヤー一覧を表示するプログラムが作成してありますが、正常に動作しません。間違いを修正して、正しく動作するようにしてください。
特定職業ページは、「/show_job/
採点して、すべてのジャッジに正解すれば、演習課題クリアです!
※ 採点時は、サーバーを起動し、問題文に関するページにアクセスできる状態にしてください。
#08:特定職業のプレイヤー一覧を表示する2
ここでは、先ほどの続きとして、SQLAlchemyとFlaskを使って、特定の職業の詳細情報を表示するページを作ります。今回は、特定の職業に属するプレイヤー一覧を表示します。
myapp/flask_app.pyfrom flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db_uri = 'mysql+pymysql://root:@localhost/mydb?charset=utf8'
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
db = SQLAlchemy(app)
class Player(db.Model):
    __tablename__ = 'players'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.Text())
    level = db.Column(db.Integer)
    job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'))
class Job(db.Model):
    __tablename__ = 'jobs'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    job_name = db.Column(db.Text())
    vitality = db.Column(db.Integer)
    strength = db.Column(db.Integer)
    agility = db.Column(db.Integer)
    intelligence = db.Column(db.Integer)
    luck = db.Column(db.Integer)
    player = db.relationship('Player', backref=db.backref('jobs', lazy=True))
@app.route('/')
def select_sql():
    message = "Hello SQLAlchemy"
    players = Player.query.all()
    jobs = Job.query.all()
    return render_template('view.html', message = message, players = players, jobs = jobs)
@app.route('/show/<int:id>')
def show_player(id):
    message = "Hello player " + str(id)
    player = Player.query.get(id)
    return render_template('view_player.html', message = message, player = player)
@app.route('/show_job/<int:id>')
def show_job(id):
    message = "Hello Job " + str(id)
    job = Job.query.get(id)
    return render_template('view_job.html', message = message, job = job)
myapp/templates/view_job.html{% extends "layout.html" %}
{% block content %}
    <h1>Hello SQL</h1>
    <p>{{ message }}</p>
    <ul>
        <li>ID:{{ job.id }}</li>
        <li>名前:{{ job.job_name }}</li>
        <li>体力:{{ job.vitality }}</li>
        <li>強さ:{{ job.strength }}</li>
    </ul>
    <h2>Player</h2>
    <ul>
        {% for player in job.player %}
            <li>{{player.id}}: {{player.name}}</li>
        {% endfor %}
    </ul>
    <p><a href="/">戻る</a></p>
{% endblock %}
myapp/templates/view.html{% extends "layout.html" %}
{% block content %}
    <h1>{{ message }}</h1>
    <table>
    {% for player in players %}
        <tr>
            <td>{{ player.id }}</td>
            <td>{{ player.name }}</td>
            <td>{{ player.level }}</td>
            <td>{{ player.job_id }}</td>
            <td>{{ player.jobs.job_name }}</td>
            <td><a href='/show/{{ player.id }}'>表示</a></td>
        </tr>
    {% endfor %}
    </table>
    <h2>職業一覧</h2>
    <table>
    {% for job in jobs %}
        <tr>
            <td>{{ job.id }}</td>
            <td>{{ job.job_name }}</td>
            <td>{{ job.vitality }}</td>
            <td>{{ job.strength }}</td>
            <td><a href='/show_job/{{ job.id }}'>表示</a></td>
        </tr>
    {% endfor %}
    </table>
{% endblock %}
SQLAlchemy入門 SQLAlchemyとは - Python学習講座
http://www.python.ambitious-engineer.com/archives/1469
[オブジェクト関係マッピング - Qiita]
https://qiita.com/yk-nakamura/items/acd071f16cda844579b9
FlaskとPostgreSQLでウェブアプリを作ってHerokuで無料で運用する - Qiita
https://qiita.com/croquette0212/items/9b4dc5377e7d6f292671
Flask + Flask-SQLAlchemy のチュートリアルを日本語で (記事まとめ) - モブプロな人たちのブログ
http://blog.mobming839.net/entry/flask-sqlalchemy-tutorial-00
Flask-SQLAlchemyのモデルでのリレーションシップ | blog.PanicBlanket.com
http://blog.panicblanket.com/archives/2987