Flask-SQLAlchemyのモデルでのリレーションシップ

一昨日のアプリを作る段階で、Flask-SQLAlchemy のモデルでのリレーションシップの作り方を調べたのでメモ。↓ここに書いてある。

 cf. One-to-Many Relationships – Flask SQLAlchemy

簡単に言うと、主キーを持つテーブルにリレーションシップを作成して、外部キーを持つテーブルに db.ForeignKey を設定してやる。
次の例では Category と Format が Book に対して1対多リレーションになっている。つまり、Category と Format が主キーを持っていて、Book が外部キーを持っている。

class Book(db.Model):
    __tablename__ = 'books'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String)
    volume = db.Column(db.String)
    series = db.Column(db.String)
    series_volume = db.Column(db.String)
    author = db.Column(db.String)
    translator = db.Column(db.String)
    publisher = db.Column(db.String)
    category_id = db.Column(db.Integer, db.ForeignKey('categories.id'))
    format_id = db.Column(db.Integer, db.ForeignKey('formats.id'))
    isbn = db.Column(db.String)
    published_on = db.Column(db.String)
    original_title = db.Column(db.String)
    note = db.Column(db.String)
    keyword = db.Column(db.String)
    disk = db.Column(db.String)
    disposed = db.Column(db.Boolean, default=False)

class Category(db.Model):
    __tablename__ = 'categories'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    books = db.relationship('Book', backref='category', lazy='dynamic')

class Format(db.Model):
    __tablename__ = 'formats'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    books = db.relationship('Book', backref='format', lazy='dynamic')

はじめ、ForeignKey を db.ForeignKey(‘category.id’) とやったらダメだった。モデル名 (category) じゃなくてテーブル名 (categories) でないといけないのね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください