class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True) def __init__(self, username, email): self.username = username self.email = email def __repr__(self): return '<User %r>' % self.username
# 一 class Person(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) addresses = db.relationship('Address', backref='person',lazy='dynamic') # 多 class Address(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(50)) person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
relationship函數:sqlalchemy對關係之間提供的一種便利的調用方式,關聯不一樣的表;html
backref參數:對關係提供反向引用的聲明,在Address類上聲明新屬性的簡單方法,以後能夠在my_address.person來獲取這個地址的person;git
lazy參數:決定了 SQLAlchemy 何時從數據庫中加載數據,有四個可選方式:'select','joined','subquery','dynamic':github
ForeignKey參數:表明一種關聯字段,將兩張表進行關聯的方式,表示一個person的外鍵,設定上必需要能在父表中找到對應的id值。web
class Parent(Base): id = Column(Integer, primary_key=True) child_id = Column(Integer, ForeignKey('child.id')) child = relationship("Child", backref=backref("parent", uselist=False)) class Child(Base): id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id'))
在一對多關係基礎上的父表中使用backref函數,並添加uselist參數來表示一對一關係。sql
tags = db.Table('tags', db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')), db.Column('page_id', db.Integer, db.ForeignKey('page.id')) ) class Page(db.Model): id = db.Column(db.Integer, primary_key=True) tags = db.relationship('Tag', secondary=tags, backref=db.backref('pages', lazy='dynamic')) class Tag(db.Model): id = db.Column(db.Integer, primary_key=True)
若是想要用多對多關係,須要在兩個類之間增長一個關聯的輔助表。數據庫
secondary參數:指定多對多關係中關係表的名字;canvas
backref函數:因爲在這裏咱們須要在每一頁顯示多個標籤,因此使用backref參數添加一個反向引用,配置 Page.tags 加載後做爲標籤的列表。ruby