flask sqlalchemy的一对多查询,多对多的操作
一对多:
class Parent(db.Model): id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(30),unique=True) children=db.relationship("Child",backref="parent") def __init__(self,name): self.name=name def __repr__(self): return "name is %r" %self.name class Child(db.Model): id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(30),unique=True) parent_id=db.Column(db.Integer,db.ForeignKey('parent.id')) def __init__(self,name): self.name=name def __repr__(self): return "name is %r" %r >>>db.create_all()
一对多的查询数据:
查询child所属的parent: >>>db.session.query(Child).filter(Child.name=='c1').first().parent 或: >>>Child.query.filter(Child.name=='c1').parent 查询parent的child: >>>db.session.query(Parent).filter(Parent.name=='p1').first().children 或: >>>Parent.query.filter(Child.name=='c1').children
多对多:
创建表: 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) def __init__(self,name): self.name=name def __repr__(self): return "name:%r" %self.name 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')) def __init__(self,name): self.name=name def __repr__(self): return "name:%r" %self.name
多对多的添加数据:
>>> s1=Student('s1') >>> s2=Student('s2') >>> c1=Course('c1') >>> c2=Course('c2') >>> c3=Course('c3') >>> s1.course=[c1,c2,c3] >>> s2.course=[c1,c2] >>> db.session.add(s1) >>> db.session.add(s2) >>> db.session.commit() 此时,在course,student,tags中都添加了数据。
多对多的更新数据:
和其他关系的一样
多对多的查询数据:
和其他关系的一样
多对多的删除数据:
采用remove删除数据: >>> db.session.query(Student).filter(Student.id==1).first().course.remove(c1)#仅仅从tags表中删除了 >>> db.session.commit() 如果从student到course存在关系,但从course到student没有关系(关系不是双向的),那么在“secondary” table中不会被删除。 如果关系是双向的,那么在“secondary” table中会自动删除。 >>> db.session.delete(s1) >>> db.session.commit()