zoukankan      html  css  js  c++  java
  • flask-sqlalchemy 一对一,一对多,多对多操作

    先进行如下操作:

    from flask import Flask

    from flask.ext.sqlalchemy import SQLAlchemy

    app=Flask(__name__)

    db=SQLAlchemy(app)

    一对多:

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

    插入数据:

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

    >>>db.session.add(p2)

    >>>db.session.commit()

    此时数据也被添加到数据库中了

    修改数据:

    >>>p=db.session.query(Parent).get(1)     #先查询出需要修改的条目

    或:

    >>>Parent.query.get(1)

    然后

    >>>p.name='p2'     #修改

    >>>db.session.commit()     #修改成功,的确很方便

    或者直接用一条语句:

    #直接查询出后修改,update采用字典修改{修要修改的列:'修改后的值'}

    >>>db.session.query(Child).filter(Child.id==1).update({Child.name:'c3'})

    >>>db.session.commit()

    删除数据:

    首先需要查找出需要删除的数据:

    >>>c=db.session.query(Child).filter(Child.id==2).first()    #找到一个类

    然后将其删除:

    >>>db.session.delete(c)

    >>>db.session.commit()

    删除parent和删除child一样,不过删除parent后,child的外键变为空(null)。

    查询数据:

    查询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

    一对一:

    一对一需要设置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)
        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()

    https://my.oschina.net/935572630/blog/373744

    http://www.thatyou.cn/flask使用flask-sqlalchemy操作mysql数据库%EF%BC%88三%EF%BC%89-联表一对多查询/

    http://www.bubuko.com/infodetail-1696901.html

  • 相关阅读:
    bzoj2751
    bzoj1483
    bzoj1011
    bzoj1412
    bzoj1820
    bzoj1295
    bzoj3444
    Java--Exchanger用于进行线程间的数据交换
    Java--Semaphore控制并发线程数量
    Java--Spring AOP 源码散点记录(最后整理成一篇博客)
  • 原文地址:https://www.cnblogs.com/huchong/p/8797516.html
Copyright © 2011-2022 走看看