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ベタ書きのほうが今んとこ楽ですね・・・