コンテンツにスキップ

第2章 データベース

まずはdb_insta.pyに以下のコードを書きます。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///photo.db'
db = SQLAlchemy(app)

1 Userクラス

続いてクラスUserでテーブルを定義します。

class User(db.Model):
    uid = db.Column(db.Integer, primary_key=True)
    uname = db.Column(db.String(255))
    upass = db.Column(db.String(255))

    toukou = db.relationship('Toukou', backref='user', lazy=True)

    def __init__(self, uname, upass):
        self.uname = uname
        self.upass = upass

    def __str__(self):
        return f"{self.uid} {self.uname} {self.upass}"    

今までと異なる点は、UserクラスとToukouクラスにリレーションシップを設定することです。これにより、Userクラスから関連するToukouを参照できるようになります。

このとき、db.relationshipでクラス名を指定します。backrefを指定することで、ToukouクラスからもUserクラスを参照できるようになります。そのときの名前がuserです。

2 Toukouクラス

Toukouクラスも以下のように設定します。

class Toukou(db.Model):
    tid = db.Column(db.Integer, primary_key=True)
    uid = db.Column(db.Integer, db.ForeignKey("user.uid"))
    image = db.Column(db.String(255))
    mes = db.Column(db.String(255))
    hi = db.Column(db.DateTime, default=datetime.now)

    def __init__(self,uid,image,mes):
        self.uid = uid
        self.image = image
        self.mes = mes

    def __str__(self):
        return f"{self.tid} {self.uid} {self.image} {self.mes} {self.hi}"    

Toukouクラスでは、uidに外部キー設定をしています。db.ForeignKey("user.uid") とすることで、userテーブルのuidとリレーションシップがあることを示します。Userの方でリレーションシップを設定しましたので、これが必要になります。

また、hiはdefaultで初期化する値を指定します。現在日時で初期化します。

3 テーブル作成

テーブルをいったん全削除し作成して、初期データを入れます。最後に確認のため全検索して表示します。初期データはUserが2名。Toukouが3つです。

with app.app_context():
    db.drop_all() # テーブル全削除
    db.create_all() # テーブル作成

    # 初期データ追加
    data = [
        User(uname="tanaka", upass="aaa"),
        User(uname="yamada", upass="bbb"),
        Toukou(uid=1, image="ringo.jpg", mes="りんごです。\nサンプル画像です。"),
        Toukou(uid=2, image="mikan.jpg", mes="みかんです。\nサンプル画像です。"),
        Toukou(uid=1, image="ichigo.jpg", mes="いちごです。\nサンプル画像です。"),
    ]
    db.session.add_all(data)
    db.session.commit()

    print('全検索')
    rows = Toukou.query.all()
    for r in rows:
        print(r)
        print(r.user)

最後に全検索して表示しています。このとき、Toukouのみを検索しています。取り出した rで r.user とすれば、その投稿のユーザが参照できます。