外縁部:re

学んだことのメモです: Notebook of Study

flask-sqlalchemy での relationship のオプション backref について - Flask Web Development の勉強(3)-

最初?と思ったのでメモ

ユーザーと、それに紐づくロールのテーブルを想定
test.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import os

basedir = os.path.abspath(os.path.dirname(__file__)) # hello.pyの存在するディレクトリ

app = Flask(__name__) #

# app.config 設定
app.config['SQLALCHEMY_DATABASE_URI'] =\
    'sqlite:///' + os.path.join(basedir, 'data.sqlite') # sqliteのベースディレクトリ指定
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] =True # データベース変更時に自動コミットする設定

db = SQLAlchemy(app) # db操作用のオブジェクト生成

# SQLAlchemyのテスト用クラス
class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role') # usersテーブルへの逆参照 ??  

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True) 

ここで対話シェルで

from hello import db
db.drop_all()
db.create_all()
from hello import Role, User
admin_role = Role(name='Admin')
mod_role = Role(name='Moderator')
user_role = Role(name='User')
user_john = User(username='john', role=admin_role)
user_susan = User(username='susan', role=user_role)
user_david = User(username='david', role=user_role)
db.session.add_all([admin_role, mod_role, user_role, user_john, user_susan, user_david])
db.session.commit()

と入れると以下のようなテーブル構造になる

roles users
id name id username role_id
1 Admin 1 john 1
2 Moderator 2 susan 3
3 User 3 david 3

ここで例えば、user_susan以下を見るとこんな感じになってる

user_susan.id           user_susan.query        user_susan.role         user_susan.username     
user_susan.metadata     user_susan.query_class  user_susan.role_id      

user_susan.roleというのができていて、user_susan.role以下は

user_susan.role.id           user_susan.role.name         user_susan.role.query_class  
user_susan.role.metadata     user_susan.role.query        user_susan.role.users    

と、結びつけられたroleをuser_susanオブジェクトから参照できるようになっている。

print(user_susan.role.id)
>>3
print(user_susan.role.name)
>>User

となる。backref指定がない場合どうなるかはおいおい調べようかなと。
ORM、概念はわかるのですがsqlベタ書きのほうが今んとこ楽ですね・・・