該連接http://www.itwhy.org/%E6%95%B0%E6%8D%AE%E5%BA%93/flask-sqlalchemy-%E5%AD%A6%E4%B9%A0.html涉及的查詢種類比較多。html
先進行以下操做:sql
from flask import Flask數據庫
from flask.ext.sqlalchemy import SQLAlchemyflask
app=Flask(__name__)session
db=SQLAlchemy(app)
app
一對多:spa
class Parent(db.Model):htm
id=db.Column(db.Integer,primary_key=True)sqlalchemy
name=db.Column(db.String(30),unique=True)
ip
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()