sqlalchemy中的orm讓我們可以很方便的採用類似python物件的方式去運算元據庫,非常的方便實現增刪改查的各種功能,下面一一陳述
值得一說的是,sqlalchemy中的物件分為四種狀態
transient:短暫的,主要指記憶體中的物件
pending:掛起的,這樣的物件準備插入資料庫,等執行了flush就會插入
persistent:持久的
detached:物件在資料庫裡面有記錄,但是不屬於session
1.新增資料
當我們使用類似
admin_group = admin_group()
admin_group.name = 'aaaa'
admin_group.limit = '1'
admin_group.create_time = time.time()
或者
admin_group = admin_group(name=name,limit = '1',create_time=time.time())
時,會建立乙個python物件,此時處於
transient狀態
暫時與sqlalchemy的session沒什麼關係
在使用
self.orm.add(admin_group)
self.orm為乙個session物件
此時admin_group為pending狀態,處於session管理之下,但沒有在資料庫中有記錄
self.orm.commit()
現在向資料庫中提交session,現在
admin_group為persistent狀態,處於session管理,而且在資料庫中也有記錄
與未commit之前有很明顯的區別的就是,那些有資料庫管理的預設字段或者是自增字段會賦值給python物件,
在commit之前,會發現admin_group.id==none,commit之後會出現數值
在commit之後,sqlalchemy會新展開乙個事務,並重新整理上乙個事務中的物件
當呼叫self.orm.close()時,session被關閉,此時admin_group處於detached,不在session管理之下,廢話,因為session已經關閉了,當然不在額
2.修改資料
在上述commit之後,admin_group的值仍可以被修改,
此時admin_group.name='aaaa'
我們使用
admin_group.name='bbbb'
self.orm.commit()
可以把資料庫中對應行name欄位改為bbbb
當然也可以配合查詢直接修改
self.orm.query(admin_group).filter(admin_group.id == id).update(, synchronize_session=false)
self.orm.commit()
3.刪除資料
self.orm.query(admin_group).filter(admin_group.id.in_(groups)).delete(synchronize_session=false)
self.orm.commit()
或者
self.orm.delete(admin_group)
self.orm.commit()
4.查詢資料
查詢的東西最多,放到最後說
說到查詢,就不得不說query物件,
query物件有我們查詢的各種因素
上案例1.
select * from admin_group
是
self.orm.query(admin_group).all()2.
select admin_group.id,admin_group.name from admin_group
是
self.orm.query(admin_group.id, admin_group.id.name).all()
select * from admin_group where id=1
是
self.orm.query(admin_group).filter(admin_group.id==1).all()
或self.orm.query(admin_group).get(1)
因為filter函式返回值也是乙個query物件,所以可以直接級聯
self.orm.query(admin_group).filter(admin_group.id==1).filter(admin_group.name=='bbbb').all()
不僅僅可以用all()
也可以直接用python的切片取一部分資料
select * from admin_group limit 2 offset 1
是
self.orm.query(admin_group).filter(admin_group.id==1)[1:3]
還有很多其他查詢
• equals:
query.filter(user.name ==
』ed』)
• not equals:
query.filter(user.name !=
』ed』)
• like:
query.filter(user.name.like(』
%ed%』))
• in:
query.filter(user.name.in_([』ed』, 』wendy』, 』jack』]))
query.filter(user.name.in_( session.query(user.name).filter(user.name.like(』
%ed%』))
))• not in:
query.filter(~user.name.in_([』ed』, 』wendy』, 』jack』]))
• is null:
query.filter(user.name ==
none)
query
.filter(user
.name
.is_(
none))
• is not null:
query.filter(user.name !=
none)
query
.filter(user
.name
.isnot(
none))
• and:
from sqlalchemy import and_
query.filter(and_(user.name ==
』ed』, user.fullname ==
』ed jones』))
query.filter(user.name ==
』ed』, user.fullname ==
』ed jones』)
query.filter(user.name ==
』ed』).filter(user.fullname ==
』ed jones』)
• or:
from sqlalchemy import or_
query.filter(or_(user.name ==
』ed』, user.name ==
』wendy
• match
: query.filter(user.name.match(』wendy』))
StringGrid系列文章2
在string的灰色單元中寫的字能夠分成兩行 stringgrid控制項如何連線按鈕控制項 mouse在tstringgrid外單擊時,tstringgrid如何得到通知 如何在stringgrid當前行第一列也像dbgrid樣標出箭頭呢 如何在delphi 的stringgrid 控制項的 cel...
Bootstrap系列 2 標題
一.bootstrap標題 在bootstrap中使用標題和html本身沒有太大的區別使用h1 h6,而bootstrap只是預設修改了h1 h6的樣式,網上找到如下資料參考 二.bootstrap 標題的修改 1.重新設定了margin top和margin bottom的值,h1 h3重置後的值...
Git 基礎系列 2
2 在linux下安裝git環境 三 git 使用流程 windows下安裝git是一件非常舒適的事情,幾乎不需要過多操作,簡單幾步即可完成。也可以選擇npm 的git映象 速度絕對美好 1 2 安裝 安裝過 的沒什麼好說的,正常的安裝步驟,在選擇安裝路徑的時候選擇乙個自己喜歡的路徑就好 小c不喜歡...