賀宗平 賀曦冉 秦新國



摘 ?要:在使用Python進行系統應用開發的過程中,對各類型的關系型數據庫,如MySQL、Oracle、SQL Server等的增、刪、改、查操作,需要基于ORM框架規范的概念和模型。因此從安全性、可擴展性等角度分析測試Python社區生態中的多種ORM框架,以及適用于不同的應用場景和條件,并提出對ORM框架性能進行橫向對比測試分析的方法和實例,具有較高的實用價值。
關鍵詞:Python;ORM;數據庫;性能測試
中圖分類號:TP392 ? ? ?文獻標識碼:A 文章編號:2096-4706(2021)06-0083-04
Research on a Test and Analysis Method of Python ORM Framework Performance
HE Zongping,HE Xiran,QIN Xinguo
(Information Office,Nanjing Audit University,Nanjing ?211815,China)
Abstract:In the process of carrying out system application development using Python,the URUD operations on various types of relational database,such as MySQL,Oracle,SQL Server and so on,needs to base on the concept and model of ORM framework specification. Therefore,it is of great practical value to analyze and test many ORM frameworks in Python community ecology from the angles of security and scalability,as well as applying to different application scenarios and conditions,and put forward methods and examples of horizontal comparative test and analysis of ORM framework performance.
Keywords:Python;ORM;database;performance testing
0 ?引 ?言
在利用Python進行Web應用系統進行如網絡數據可視化分析、知識圖譜應用相關的開發過程中,其中涉及大量對各類型數據庫的訪問操作,如MySQL、Oracle、SQL Server等,主要是“增、刪、改、查”(CRUD)。在應用程序開發中,從訪問性能、安全性和可擴展性等方面考慮,對數據庫相關訪問操作往往是通過ORM框架來實現。Python社區生態中有多種ORM框架,適用于不同的應用場景和條件,因此對ORM框架性能進行橫向基準測試分析,在不同的場景需求下選擇適合的ORM框架,對于提升應用系統性能具有重要的價值意義。
1 ?ORM概述
1.1 ?基本概念
在沒有ORM框架條件下,如果系統程序需要操作數據庫,需要在開發中編寫原生SQL語句,并通過數據驅動接口模塊遠程操作數據庫,如圖1所示。
這個數據庫操作過程可以概括為以下幾個步驟:
(1)建立數據庫連接,獲得連接對象。
(2)根據用戶的操作定義組裝SQL執行語句。
(3)用連接對象執行SQL語句,獲得結果集數據對象。
(4)最后釋放連接資源,關閉連接對象。
這種操作流程邏輯復雜、重復度高,并存在注入攻擊等安全風險問題,系統的設計也無法做到業務與數據邏輯分離,不利于降低系統模塊間的緊耦合關系。在系統開發中編寫原生SQL語句會存在數據庫適配遷移問題,例如針對Oracle開發的SQL語句無法平移應用到其他數據庫上,一旦需要遷移改變數據庫類型,會在源代碼層級帶來巨大的變更成本。
1.2 ?ORM作用
為解決Python系統開發數據庫操作的問題,實踐中引入了ORM框架的概念。ORM(Object Relational Mapping)即對象關系映射,通過對各種類型數據庫驅動連接庫進行封裝,避免對數據庫直接編寫SQL的操作,如圖2所示。
主要作用表現在以下幾個方面:
(1)統一訪問接口。通用數據庫交互接口是ORM設計表現核心,使得能夠以統一的方式與各種不同類型的數據庫進行訪問交互,避免了各種不同數據庫SQL語法不同的問題。
(2)簡化訪問方式。ORM封裝提供了完整的數據庫操作細節流程,不再需要開發人員構造煩瑣的數據庫訪問流程。
(3)實現分層模式。ORM解決了面向對象設計與關系型數據庫的匹配問題,建立了對象與關系之間的映射框架,是MVC分層模式中的內存對象持久化存儲具體實現方式。
(4)提高安全特性。由于ORM框架無須用戶自定義拼接SQL語法等操作,從而阻斷了外部的注入攻擊等威脅,提升代碼的安全性。
1.3 ?ORM模型
ORM框架中的類對應簡稱為模型,模型是數據的結構性定義,包含存儲數據的字段類型和方法。每個模型都對應映射到某個數據表,模型中的屬性對應數據表的字段。以Django ORM為例進行CRUD操作示例:
(1)在ORM框架中操作數據,必須先創建模型對應數據庫表。創建示例模型:
class Employee():
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=16)
gender=models.BooleanField(default=1)
birth=models.DateField()
department=models.CharField(max_length=30)
salary=models.DecimalField(max_digits=10,decimal_places=1)
(2)增加記錄:
obj=Employee(name="John",gender=0,birth='1982-01-27',department="信息部",salary=1024)
obj.save()
(3)查詢記錄:查詢所有名字為John的記錄并獲取第一條。
obj=Employee.objects.filter(name="John").first()
print(obj.id,obj.name,obj.birth)
(4)修改記錄:過濾所有名字為John的記錄并將name字段更新為JOHN。
Employee.objects.filter(name="John").update(name= "JOHN")
(5)刪除記錄:過濾出所有名字為EGON的記錄并刪除。
Employee.objects.filter(name="JOHN").delete()
2 ?Python ORM典型框架
2.1 ?Django ORM
Django ORM具備所有ORM框架的重要特性,允許以接近SQL的方式與數據庫交互,操作簡單、簡潔并且開放。在Django中model代表數據信息的來源和結構,包含了存儲數據的重要字段和行為 。通常用一個模型(model)映射到某個數據表,建立模型與數據存儲之間的關聯映射。 Django ORM框架概括起來包括三個方面:
(1)每個模型都是一個Python類,它是django.db. models.Model的子類。
(2)模型的每個屬性都代表一個數據庫字段。
(3)Django為用戶提供了一個自動生成的數據庫訪問API。
2.2 ?Peewee
Peewee是一個輕量級的Python ORM,操作使用直觀。Peewee中一個model類代表一個數據庫的表,一個Field字段代表數據庫中的一個字段,而一個model類實例化對象則代表數據庫中的一行。Peewee使用主要包括兩部分:
(1)定義model。在使用的時候,根據需求先定義好Model,然后可以通過create_tables()創建表,若是已經創建好數據庫表了,可以通過pwiz腳本工具直接創建model。其中,CharField、DateField、BooleanField等這些類型與數據庫中的數據類型一一對應。
(2)操作數據庫。Peewee中的數據模型實例可以直接進行增、刪、改和查的操作。save()對應增加數據;使用delete().where().execute()進行刪除,where()是條件、execute()負責執行語句;使用update().where()進行更新數據;查詢使用select().where(),select()是查詢,where()是條件,get()是獲取第1條數據。
2.3 ?Pony ORM
Pony ORM提供便捷化的查詢語法,實現了自動查詢優化,提供在線的ORM ER實體關系圖編輯器。與Django ORM相比,Pony ORM提供:標識映射模式、自動事務管理、自動緩存查詢和對象、完全支持復合鍵。Pony ORM支持全自動緩存、讀取速度快,缺點是不支持批量插入。
2.4 ?SQLAlchemy ORM
SQLAlchemy ORM是Python中一個使用較為普及的框架庫,具備高性能的數據庫訪問設計,實現了完整的企業級持久模型。SQLAlchemy設計將SQL數據庫的量級和性能放在首位,其次是對象集合的抽象。因此SQLAlchemy不同于其他PythonORM框架所采用的Active Record模型,其采用了近似JavaHibernate的數據映射模型。在SQLAlchemy中,“增刪改查”操作通過DBSession對象來創建完成。
2.5 ?Tortoise ORM
與Python中其他成熟ORM相比,Tortoise ORM是一種異步ORM框架,基于Python中的asyncio異步標準庫實現,支持原生的異步編程。在IO密集型的應用場景中,異步處理方式能提極大地升效率,從而彌補Python運算性能方面的短板。主要特點包括:
(1)開發測試便捷。測試框架使用現有的Python Unittest框架,只需要調用initializer()和finalizer()來設置和刪除測試數據庫。
(2)可組合支持Django模型。
(3)支持多種標準字段。
(4)支持復合查詢API。
3 ?性能測試方法
3.1 ?基本條件
ORM性能測試的首先要考慮以下幾個基本條件:
(1)ORM框架至少支持2個以上的數據,例如MySQL、SQLite。
(2)框架運行環境為Python 3.7。
(3)框架處于積極更新維護中。
(4)能夠生成指定模型的初始DDL。
(5)處理一對多關系。
3.2 ?測試基準
3.2.1 ?測試內容
測試內容包括幾個方面內容:
(1)插入:單條插入(IS),批量插入(IBH),批量導入(IBK)。
(2)過濾:大量數據過濾(FL),少量數據過濾(FS),字典過濾(FD),元組過濾(FT)。
(3)更新:整個結構數據更新(UW),部分字段數據更新(UP)。
(4)刪除:按過濾條件刪除(DL)。
(5)查詢:按過濾條件查詢(GS)。
3.2.2 ?測試數據表
測試操作的數據表包括三種:無關聯關系小型表、有關聯關系小型表、大型表:
(1)無關聯關系小型表(small_table_nr)如表1所示。
(2)有關聯關系小型表(small_table_wr)如表2所示。
(3)大型表(large_table)如表3所示。
3.3 ?測試結果
3.3.1 ?SQLite測試結果
SQLite測試數據結果如表4所示,Peewee和Pony ORM有顯著的性能提升,SQLAlchemy和Django ORM性能表現近似,Tortoise ORM讀取速度慢,創建、更新和刪除操作速度較快。
3.3.2 ?MySQL測試結果
MySQL測試數據結果如表5所示,Peewee和Tortoise ORM有較好的性能表現,Pony ORM性能表現相對更快,SQLAlchemy和Django ORM操作速度則表現相對更慢。
4 ?結 ?論
通過測試數據結果分析,總體來說Pony ORM具有高度優化的性能表現,Django ORM 和SQLAlchemy在性能上表現上相似相近。Tortoise ORM由于采用了異步框架支持,避免了IO讀寫上的等待時間耗費,具有十分出色的性能表現。Python異步框架對于提升數據庫相關操作效率具有十分重要的意義,融合異步技術將是Python ORM框架發展重點方向。
參考文獻:
[1] 楊立苑,李芬,周雪瑩,等.面向氣象Web應用的數據庫訪問性能優化及應用 [J].計算機與數字工程,2020,48(11):2671-2676.
[2] 熊學鋒,彭小慶,曹鑫.基于改進ORM的Oracle數據庫異構資源整合方法研究 [J].電子設計工程,2020,28(21):38-41+46.
[3] 蹇常林.ORM在Django操作數據庫中的應用 [J].技術與市場,2020,27(1):56-57.
[4] 郭顯娥.Django實現ORM模型數據查詢優化 [J].山西大同大學學報(自然科學版),2019,35(3):27-31+36.
[5] 熊偉,歐陽逸,張凌云.一種數據庫訪問代碼自動生成方法 [J].廣州大學學報(自然科學版),2019,18(3):93-95.
[6] 陳忠菊.基于SQLAlchemy的研究和在數據庫編程中的應用 [J].電腦編程技巧與維護,2015(1):62+85.
[7] 郎芳.基于Django技術的自動化測試工具設計與實現 [D].西安:西安電子科技大學,2012.
作者簡介:賀宗平(1982.09—),男,漢族,江蘇南京人,工程師,碩士,主要研究方向:軟件體系架構、數據平臺。