關於SQLALCHEMY之(一)

2022-05-29 10:36:10 字數 2904 閱讀 2419

sqlalchemy是乙個不可靠的方案。對於初級開發者而言,並不如sql語句來得簡明。

或者說,我不知道是不是所有的orm資料庫物件對映方案都存在這麼一種情況。純以開發邏輯而言。下述兩段**的結論是一致的:

code1 : 正確實現

partner_name = request.args.get("partner_name")

site_name = request.args.get("site_name")

delegation_query = db.session.query(delegation)

delegation_query = delegation_query.\

filter(or_(

delegation.grantee_id == partner_id,

delegation.grantor_id == partner_id))

if site_name is

notnone:

delegation_query = delegation_query.\

join(site, site.id == delegation.site_id).\

filter(site.name.like('%'

+ site_name +

'%'))

if partner_name is

notnone:

q1 = delegation_query.\

join(partner, partner.id == delegation.grantee_id).\

filter(partner.name.like('%'

+ partner_name +

'%'))

q2 = delegation_query.\

join(partner, partner.id == delegation.grantor_id).\

filter(partner.name.like('%'

+ partner_name +

'%'))

delegation_query = q1.union(q2)

code2 : 錯誤實現

delegation_query = db.session.query(delegation)

if partner_name is

notnone:

q1 = delegation_query.\

join(partner, partner.id == delegation.grantee_id).\

filter(partner.name.like('%'

+ partner_name +

'%'))

q2 = delegation_query.\

join(partner, partner.id == delegation.grantor_id).\

filter(partner.name.like('%'

+ partner_name +

'%'))

delegation_query = q1.union(q2)

if site_name is

notnone:

delegation_query = delegation_query.\

join(site, site.id == delegation.site_id).\

filter(site.name.like('%'

+ site_name +

'%'))

delegation_query = delegation_query.\

filter(or_(

delegation.grantee_id == partner_id,

delegation.grantor_id == partner_id))

另外附上這段**的實現目標。partner為使用者。site為資源。delegation為使用者對資源的對映關係。

即:partner表儲存使用者的資訊。site表儲存資源資訊。delegation表以id為對映字段儲存資源和使用者的對應關係。

此處,delegation的作用是,乙個使用者將自己擁有的資源的許可權部分開放給其他使用者。

從系統使用者的角度考慮,輸入的引數為:使用者名稱,資源名稱。另外乙個預設的引數是從登入狀態中取得的,當前使用者的id。(查詢許可權控制)

由於實現模糊匹配的需要。這塊的判斷邏輯如下:

1.  當資源名稱輸入不為空,需要將關係表和資源表進行連線,實現通過名稱查詢資源。

2.  當使用者名稱輸入不為空,需要將關係表和使用者表進行連線,實現通過名稱查詢資源。

3.  為了執行條件2.需要確認關係表和使用者表以哪個鍵進行連線。(由於授權的關係,關係表中有兩列外來鍵對應使用者表id。乙個是資源所有者,乙個是授權的目標使用者)

4.  為了執行條件3.由於部分資料庫似乎不支援full join。因此採用union進行聯合查詢。

5.  查詢除了上述1-4條件的基本邏輯外,必須滿足這個條件:使用者或者是具有了使用該資源的許可權,或者是該資源的所有者。

從賦值角度考慮,以及過往的使用方法來看。sqlalchemy是支援序列操作的。但是code1和code2生成的sql語句是不同的。

實際中,code2實現的功能,已知在資源名稱和使用者名稱都有輸入值的情況下,忽略了資源名稱條件,查詢了結果。且未知的情況是,是否滿足了條件5的設計。

這件事情來看,不論結果是否是我自身**寫法風格的問題。至少這樣來看。並不是簡單的串聯問題。

因此對當前階段是否應該使用sqlalchemy產生了懷疑。至少如果使用orm類初期,對於orm封裝內部的邏輯不了解的情況下,這件事情是不可靠的。

也許有文件說明這個問題,也許沒有。不過至少上述這麼一點問題是需要關注的,除此以外,對於orm編寫的sql的調優,難度會更高。

總不能每次都用print(str(sql))的方式來解決問題吧。雖然這就是學習方法。。。

關於python使用sqlalchemy

sqlalchemy是python運算元據庫的乙個庫。能夠進行orm對映,sqlalchemy 採用簡單的python語言,為高效和高效能的資料庫訪問設計,實現了完整的企業級持久模型 sqlalchemy的理念是,sql資料庫的量級和效能重要於物件集合 而物件集合的抽象又重要於表和行。安裝sqlal...

關於JDBC的優化之一

以下是一些常用的jdbc小技巧,也許可以提高你的系統的執行速度。1.當使用preparedstatement callablestatement時,盡量使用它提供的setparams的方法。下面是錯誤的方法 callablestatement cstmt conn.preparecall resul...

關於函式的總結之一

1 前言 在每種語言中,總是會存在函式,那麼為什麼每種語言都有函式這個東西呢?函式,簡單的來說,是一種對程式在邏輯上進行結構化的一種程式設計方法,主要就是將需要解決的問題來進行抽象,來進行分解,從而達到 復用的目的。2 函式的基本概念 建立函式如下 def createfunction x,y re...