基於ORM的CRUD

SQLAlchemy的增刪改查

1.增加 - C(Create)

  1. 創建實體類對象,併爲對象的屬性賦值
    示例:
    #每一條數據即一個對象
    user = Users()
    user.username = "wangwc"
    user.age = 37
    ... ...
    
  2. 將實體對象保存回數據庫
    db.session.add(user)
    #針對非查詢操作,必須手動將操作提交回數據庫
    db.session.commit()
  3. 配置自動提交操作或數據庫
    app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN’]=True
    當視圖函數執行完畢後,自動提交所有操作到數據庫中

2.查詢 - R(Retrieve)

1.基於 db.session 進行查詢

  1. db.session.query()
    1. 參數: 要查詢的列,如果查詢多個列的話使用,隔開,如果要查詢所有
    2. 示例:
      1. 查詢 Users實體類中的id,username,age
        db.session.query(Users.id,Users.username,Users
      2. 查詢Users實體類中所有的列
        db.session.query(Users)
        3.查詢Users實體類以及Wife實體類中所有列
        db.session.query(Users,Wife)
        返回值:
        該函數會返回一個Query對象,類型爲BaseQuery
  2. 查詢執行函數
    目的:在db.session.query()上得到最終的結果
    語法:db.session.query(xxx).查詢執行函數()
    函數 說明
    all() 以列表的方式返回所有數據
    first() 以實體對象的方式返回查詢中的第一條數據,
    first_or_404() 效果同上,如果沒有數據則響應 404
    count() 返回查詢結果的數量
  3. 查詢過濾器函數
    1. 作用
      在db.session.query() 追加篩選條件
    2. 語法
      db.session.query().查詢過濾器函數().查詢執行函數()
過濾器函數 作用
filter() 指定查詢條件
filter_by() 等值查詢條件中使用
limit() 獲取前幾行數據
offset() 指定結果偏移量
order_by() 排序
group_by() 分組
  1. filter() :構建各種各樣的條件
#1. and示例
db.session.query(Users).filter(Users.age>17).filter(Users.id > 1).all()
db.session.query(Users).filter(Users.age>17,Users.id>1).all()

# 2. or示例
from sqlalchemy import _or
xxx.filter(or_(條件1,條件2))

#3. 模糊查詢 like
db.session.query(Users).filter(Users.email.like("%wang%"))

#in 示例
db.session.query(Users).filter(Users.age.in_([17,30,45])).all()

#between and
db.session.query(Users).filter(Users.age.between(30,45)).all()
  1. filter_by():只能做單表的等值條件過濾篩選
    語法:
    db.session.query(XX).filter_by(屬性=值).all()
    特點:
    1. 不用實體類.屬性,而直接用屬性名即可
    2. 等值判斷使用 = , 而不是 ==
  2. limit() & offset()
    1. limit(n)
      作用:獲取前n行數據
      語法:
      db.session.query(XX).limit(n).all()
    2. offset(n)
      作用:從查詢結果中跳過前n跳數據
      語法:
      db.session.query(XX).offset(n)
  3. order_by()
    作用: 排序
    示例:
#1. 將Users實體中所有的數據降序排序
db.session.query(Users).order_by("age desc").all()

#2. Users實體中大於18歲的人,按年齡降序排序,如果年齡相同按id升序排序
db.session.query(Users).filter(Users.age > 18).order_by("age desc,id").all()
  1. group_by():聚合查詢
    1. 基本的聚合查詢
      from sqlalchemy import func
      #func對象中提供了所有的聚合函數
      聚合函數:
      sum() : 求和 , func.sum()
      count():
      max():
      min():
      avg():
      語法:
      db.session.
      query(func.聚合函數(實體類.屬性)).all()
    2. 完整的查詢操作
    db.session.query(查詢列,聚合列)
    	.filter(條件) # 分組前篩選 - where
    	.group_by('分組') # 分組 - group by
    	.having(條件) # 分組後篩選 - having
    

2.基於實體類的查詢

實體類.query.查詢過濾器函數().查詢執行函數()

  1. 查詢Users實體中所有的數據
    Users.query.all()

3.修改 - U

步驟:與增加數據類似
1.查
查詢出要修改的實體對象
2.改
通過實體對象.屬性 = 值
3.保存
db.session.add(實體對象)
eg:

	#修改 Users 實體中 id 爲 1 的人的年齡爲37
	user = db.session.query(Users).filter_by(id=1).first()
	user.age = 37
	db.session.add(user)
	# 創建用戶並添加至數據庫中
	user = Users()
	user.username = xxx
	user.age = xxx
	user.email = xxx
	db.session.add(user)

4.刪除 - D

  1. 查詢
    查詢出要刪除的實體對象
  2. 刪除
    db.session.delete(對象)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章