模型的關聯:
一對多
class Role(db.Model): us = db.relationship('User',backref='role',lazy='dynamic') class User(db.Model): role_id = db.Column(db.Integer,db.ForeignKey('roles.id')) * 其中realtionship描述了Role和User的關系。在此文中,第一個參數為對應參照的類"User" * 第二個參數backref為類User申明新屬性的方法 * 第三個參數lazy決定了什么時候SQLALchemy從數據庫中加載數據 * 如果設置為子查詢方式(subquery),則會在加載完Role對象后,就立即加載與其關聯的對象,這樣會讓總查詢數量減少,但如果返回的條目數量很多,就會比較慢 * 設置為 subquery 的話,role.users 返回所有數據列表 * 另外,也可以設置為動態方式(dynamic),這樣關聯對象會在被使用的時候再進行加載,並且在返回前進行過濾,如果返回的對象數很多,或者未來會變得很多,那最好采用這種方式 * 設置為 dynamic 的話,role.users 返回查詢對象,並沒有做真正的查詢,可以利用查詢對象做其他邏輯,比如:先排序再返回結果
多對多
1 registrations = db.Table('registrations', 2 db.Column('student_id', db.Integer, db.ForeignKey('students.id')), 3 db.Column('course_id', db.Integer, db.ForeignKey('courses.id')) 4 ) 5 class Course(db.Model): 6 ... 7 class Student(db.Model): 8 ... 9 classes = db.relationship('Course',secondary=registrations, 10 backref='student', 11 lazy='dynamic')
查詢filter_by精確查詢
User.query.filter_by(name='wang').all()
first()返回第一個查詢的對象
User.query.first()
all()返回查詢到的所有對象
User.query.all()
filter模糊查詢,返回名字結尾符為g的所有數據
User.query.filter(User.name.endswith('g')).all()
get:參數為主鍵,如果主鍵不存在就沒有內容返回
User.query.get()
邏輯非 。返回名稱不等於wang的所有數據
User.query.filter(User.name!='wang').all()
not_相當於取反
from sqlalchemy import not_
User.query.filter(not_(User.name=='chen')).all()
邏輯與,and_
from sqlalchemy import and_
User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()
邏輯或 or_
from sqlalchemy import or_
User.query.filter(or_(User.name!='wang',User.email.endswith('163.com'))).all()