python中关系映射主要包括三种:一对多关系映射、一对一关系映射、多对多关系映射。
一对多关系映射 一方:Student(学生) 添加关联属性和反向引用 多方:Article(文章) 添加外键关联 一对一关系映射 一方:Student(学生)主表 添加多对多的关联属性和反向引用,同时uselist取值为FALSE,表示fetchone 添加第三张表的关联属性和反向引用关系 一方:Detail(详情表)次表 添加外键关联 多对多关系映射 多方:Users 添加多对多的关联属性和反向引用,同时指明第三张关联表(2) 添加对第三张表的关联属性和反向引用(2) 多方:Goods 添加对第三张表的关联属性和反向引用(2) 第三张关联表:UsersGoods
一对多关系映射
# 一方 class Student(db.Model): __tablename__ = "student" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30), nullable=False) # 增加关联属性和反向引用关系 # 关联属性:在student对象中通过哪个属性能够得到对应的所有的article对象 # 反向引用:在article对象中通过哪个属性能够得到它对应的student articles = db.relationship('Article', backref="student", lazy="dynamic") def __init__(self, name): self.name = name def __repr__(self): return "<Student:%r>" % self.name # 多方 class Article(db.Model): __tablename__ = "article" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30), nullable=False) # 增加一个列(外键):引用自article表的主键,这一段代码是为了生成数据库关联。 student_id = db.Column(db.Integer, db.ForeignKey('student.id')) # 这里的student是数据库表名 def __init__(self, name): self.name = name def __repr__(self): return "<Article:%r>" % self.tname
一对一关系映射
# 一方 class Student(db.Model): __tablename__ = "student" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30), nullable=False) # 增加关联属性和反向引用关系 # 关联属性:在student对象中通过哪个属性能够得到detail信息 # 反向引用:在detail对象中通过哪个属性能够得到它对应的student # uselist is for the purpose of fetchone user = db.relationship('Detail', backref='student', uselist=False) def __init__(self, name): self.name = name def __repr__(self): return "<Student:%r>" % self.name class Detail(db.Model): __tablename__ = 'detial' id = db.Column(db.Integer, primary_key=True) weight = db.Column(db.Float) student_id = db.Column(db.Integer, db.ForeignKey('student.id'))
多对多关系映射
class Users(db.Model): __tablename__ = 'users' id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(80),nullable=False,unique=True) age = db.Column(db.Integer) email = db.Column(db.String(120),unique=True) isActive = db.Column(db.Boolean,default=True) # 添加多(Users)对多(Goods)的关联属性和反向引用关系 # 涉及到第三张关联表 - users_goods goods=db.relationship( 'Goods', secondary='users_goods', lazy="dynamic", backref=db.backref( "users", lazy='dynamic') ) #增加对UsersGoods的关联属性和反向引用关系:目的是为了创建Users类 与 UsersGoods类 之间的关系 userGoods = db.relationship('UsersGoods',backref="user",lazy="dynamic") class Goods(db.Model): __tablename__ = "goods" id = db.Column(db.Integer,primary_key=True) gname = db.Column(db.String(80)) gprice = db.Column(db.Float) #增加对UsersGoods类的关联属性和反向引用关系 goodUsers = db.relationship('UsersGoods',backref="good",lazy="dynamic") # 创建 users_goods 的第三张关联表,从而来表示多对多的关系 class UsersGoods(db.Model): __tablename__ = "users_goods" id = db.Column(db.Integer,primary_key=True) users_id = db.Column(db.Integer,db.ForeignKey('users.id')) goods_id = db.Column(db.Integer,db.ForeignKey('goods.id')) count = db.Column(db.Integer,default=1) # user.goods # user.userGoods # good.users # good.goodUsers # goodUsers.good # userGoods.user