sqlalchemy系列 2 orm相關簡易操作

2021-06-26 18:04:08 字數 4046 閱讀 4835

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不喜歡...