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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM