第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 とすれば、その投稿のユーザが参照できます。