Python全棧 Web(Flask框架、CRUD、聚合分組)


模型:
 
# 根據現有的表結構構建模型類
class Users(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(80),unique=True)
    age = db.Column(db.Integer)
    email = db.Column(db.String(120),unique=True)

    def __init__(self,username,age,email):
        self.username = username
        self.age = age
        self.email = email

    def __repr__(self):
        return "<Users %r>" % self.username


插入
 具體信息在上一篇博客

# 強制刪除所有模型對應的表
db.drop_all()
# 將所有模型映射到數據庫
db.create_all()

# 向表中插入一條記錄
@app.route('/insert')
def insert_views():
    user = Users('Paris',18,'[email protected]')
    db.session.add(user)
    return "Insert OK"


FlASK-SQLAlchmey  查詢:
基於db.session  進行查詢
db.session.query()
可以有多個參數,參數表示要查詢那個實體
該函數會返回一個query對象  包含了指定實體類對應的表中所有的數據

查詢執行函數:
在查詢的基礎上得到最終想要的結果
語法:
db.session.query(...).查詢執行函數
all()
以列表的方式返回查詢的所有結果
first()
返回查詢結果中的第一個結果 沒有返回None
first_or_404()
返回查詢第一個結果如果沒有終止並返回404
count()
返回查詢結果的數量
過濾器函數:
filter()
按照指定條件進行過濾(多表,單表,定值,不定值)
filter_by()
按照等值條件進行過濾
limit()
按照限制行數獲取查詢結果
order_by()
按照指定條件進行排序
group_by()
根據指定條件進行分組

示例:
查詢所有 年齡大於30的信息
db.session.query(Users).filter(Users.age>30).all()
條件必須有模型.屬性  來組成
查詢所有 年齡大於30或者id大於5的信息
要藉助於 or_() 函數
db.session.query(Users).filter(or_(Users.age>30, Users.id>5)).all()
查詢所有 年齡大於30並且小於50的信息
db.session.query(Users).filter(Users.age>30, Users.age<50).all()
查詢所有  年齡等於30 的信息
db.session.query(Users).filter(Users.id==5).all()
查詢所有  username中含有“w”的用戶信息
db.session.query(Users).filter(Users.username.like("%w%")).all()
查詢所有  id在  1~3之間的user信息
要藉助於 in_() 函數
db.session.query(Users).filter(Users.id.in_([1, 2, 3])).all()
查詢id=5的信息
db.session.query(Users).filter_by(id=5).first()
獲取前5條數據
db.session.query(Users).limit(5).all()
獲取從2開始的前5條數據
db.session.query(Users).limit(5).offset(2).all()
對Users表中按照id倒敘排序
db.session.query(Users).order_by("id desc").all()
多級排序逗號隔開
db.session.query(Users).order_by("id desc, age asc").all()
基於Models 進行查詢
Models.query.查詢過濾器(條件參數).查詢執行函數
Users.query.filter(Users.id>3).all()


# 查詢路由
@app.route('/query')
def query_views():
    # 測試查詢
    print(db.session.query(Users))
    print(db.session.query(Users.username,Users.email))
    print(db.session.query(Users,Course))



    # 通過查詢執行函數獲得最終查詢結果
    # all() : 得到查詢中所有的結果
    users = db.session.query(Users).all()
    for u in users:
        print(u.username,u.age,u.email)


    # first() : 得到查詢中的第一個結果
    user = db.session.query(Users).first()
    print(user.username,user.age,user.email)
    course = db.session.query(Course).first()
    print(course)



    # 使用查詢過濾器函數對數據進行篩選

    # 查詢年齡大於30的Users的信息
    users = db.session.query(Users).filter(Users.age>30).all()
    print(users)

    # 查詢年齡大於30並且id大於5的Users的信息
    users = db.session.query(Users).filter(Users.age>30,Users.id > 5).all()
    print(users)

    # 查詢年齡大於30 或者 id大於 5 的Users的信息
    users = db.session.query(Users).filter(or_(Users.age>30,Users.id > 5)).all()
    print(users)

    # 查詢email中包含字符'w'的用戶的信息
    users = db.session.query(Users).filter(Users.email.like('%w%')).all()
    print(users)

    # 查詢id在1,2,3 之間的 用戶的信息
    users = db.session.query(Users).filter(Users.id.in_([1,2,3])).all()
    print(users)

    # 查詢 Users 表中所有數據的前3條
    users = db.session.query(Users).limit(3).all()
    users = db.session.query(Users).limit(3).offset(1).all()

    # 查詢Users表中所有的數據,並按照id倒敘排序
    users = db.session.query(Users).order_by('id desc,age asc')
    print(users)

    # 查詢Users表中所有的數據,並按照 age 進行分組
    users = db.session.query(Users).group_by('id').all()
    print(users)


    # 基於Models實現的查詢 : 查詢id>3的所有用戶的信息
    users = Users.query.filter(Users.id>3).all()
    print(users)
    return "Query OK"




FLASK-SQLAlchemy  刪除 和 修改
刪除:
1.查詢出要刪除的實體
user = db.session.query(Users).filter_by(id=5).first()
2.根據所提供的刪除方法將信息刪除
db.session.delete(user)

@app.route('/delete_user')
def delete_user():
    # 查詢並去除id=5的第一條記錄
    user = Users.query.filter_by(id=5).first()
    # 將改記錄刪除
    db.session.delete(user)
    return 'Delete OK'


修改:
1.查
user = Users.query.filter_by(id=1).first()
2.改
user.username = "巴黎"
3.保存
db.session.add(user)

@app.route('/update_user')
def update_user():
    # 查詢id=1的第一條記錄並取出
    user = Users.query.filter_by(id=1).first()
    # 將username改爲巴黎
    user.username = "巴黎"
    # 將年齡改爲17
    user.age = 17
    # 將數據重新插入回數據庫  如果該數據純在則更新如果不存在則創建
    db.session.add(user)
    return "Update OK"


FLASK-SQLAlchemy - 關係映射
一對多:
在“多”實體中增加
外鍵類名 = db.Column(db.Integer, db.ForeignKey(主表.主鍵))
在“一”的實體中正價反向引用關係
屬性名 = db.relationship(“對應的“多”實體類名”, backref="屬性名", lazy="dynamic")



class Course(db.Model):
    __tablename__ = "course"
    id = db.Column(db.Integer,primary_key=True)
    cname = db.Column(db.String(30))
    #反向引用:
        # 返回與當前課程相關的teacher列表
    #backref:
        # 定義反向關係,本質上會向Teacher實體中增加一個
        # course屬性.該屬性可替代course_id來訪問
        # Course模型.此時獲得到的是模型對象,而不是外鍵值
    teachers=db.relationship('Teacher',backref='course')

    def __init__(self,cname):
        self.cname = cname

class Teacher(db.Model):
    __tablename__='teacher'
    id = db.Column(db.Integer,primary_key=True)
    tname = db.Column(db.String(30))
    tage = db.Column(db.Integer)

    # 增加一列 : course_id,外鍵列,要引用自主鍵表(course)的主鍵列(id)
    course_id = db.Column(db.Integer,db.ForeignKey('course.id'))

    def __init__(self,tname,tage):
        self.tname = tname
        self.tage = tage

    def __repr__(self):
        return "<Teacher %r>" % self.tname




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章