flask的查詢,一對多,多對多


模型的關聯:
一對多
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()


免責聲明!

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



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