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()

 

posted @ 2019-01-14 10:01  大西瓜Paul  阅读(517)  评论(0)    收藏  举报
/*增加返回顶部按钮*/ 返回顶部 /*给标题增加蓝色背景长条*/