一对多
class Parent(db.Model):
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(30),unique=True)
# children是关系的名字,Parent的实例对象可以通过children来查询其对应的有那些图书
# Child是该关系对应的模型类类名,名字是类名,不能随意起
# backref='parent'是回调的引用,parent是自定义的名字,
# children的实例对习惯可以通过parent来查询其对应的作者
children=db.relationship("Child",backref="parent")
class Child(db.Model):
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(30),unique=True)
# Child的外键,db.ForeignKey('parent.id')里面必须是('引用的表表名.引用表的主键')
parent_id=db.Column(db.Integer,db.ForeignKey('parent.id'))
创建数据库
>>>db.create_all()
插入数据:
>>>p1=Parent('p1')
>>>c1=Child('c1')
>>>c2=Child('c2')
>>>p1.children=[c1,c2]
>>>db.session.add(p1)
>>>db.session.commit()
此时,表parent和表child中都插入了数据。
或:
>>>pa=Parent(''p1')
>>>c1=Child('c1')
>>>c2=Child('c2')
>>>c1.parent=p1
>>>c2.parent=p2
>>>db.session.add(c1)
>>>db.session.add(c2)
>>>db.session.commit()
此时数据也被添加到数据库中了
查询
如果知道Child的姓名,想知道Parent的姓名,可以这样查:
Chi= Child.query.filter(Child.name == 'xxx').first()
Chi.parent.name # stu.relate_class 会跳到 classes 表
如果知道Parent的名称,想返回全部Child的名字的列表,可以这样查:
Par= Parent.query.filter(Parent.name == 'xxx').first()
Par.children.name # cls.relate_stu 会跳到 students 表一对一
可以使用这样的方法,有两个要求,第一是要设置外键
parent_id=db.Column(db.Integer,db.ForeignKey('parent.id'))
第二是这句语句:
children=db.relationship("Child",backref="parent")
一对一
一对一需要设置relationship中的uselist=Flase,其他数据库操作一样。
多对多
tags=db.Table('tags',db.Column('student_id',db.Integer,db.ForeignKey('student.id')),db.Column('course_id',db.Integer,db.ForeignKey('course.id')))
class Student(db.Model):
__tablename__='student'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(30))
course=db.relationship('Course',secondary=tags)
class Course(db.Model):
___tablename__='course'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(30),unique=True)
#student_id=db.Column(db.Integer,db.ForeignKey('student.id'))