亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種Python ORM框架性能測試分析方法研究

        2021-10-19 13:22:12賀宗平賀曦冉秦新國
        現(xiàn)代信息科技 2021年6期
        關(guān)鍵詞:數(shù)據(jù)庫

        賀宗平 賀曦冉 秦新國

        摘 ?要:在使用Python進(jìn)行系統(tǒng)應(yīng)用開發(fā)的過程中,對各類型的關(guān)系型數(shù)據(jù)庫,如MySQL、Oracle、SQL Server等的增、刪、改、查操作,需要基于ORM框架規(guī)范的概念和模型。因此從安全性、可擴(kuò)展性等角度分析測試Python社區(qū)生態(tài)中的多種ORM框架,以及適用于不同的應(yīng)用場景和條件,并提出對ORM框架性能進(jìn)行橫向?qū)Ρ葴y試分析的方法和實(shí)例,具有較高的實(shí)用價值。

        關(guān)鍵詞:Python;ORM;數(shù)據(jù)庫;性能測試

        中圖分類號:TP392 ? ? ?文獻(xiàn)標(biāo)識碼: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進(jìn)行Web應(yīng)用系統(tǒng)進(jìn)行如網(wǎng)絡(luò)數(shù)據(jù)可視化分析、知識圖譜應(yīng)用相關(guān)的開發(fā)過程中,其中涉及大量對各類型數(shù)據(jù)庫的訪問操作,如MySQL、Oracle、SQL Server等,主要是“增、刪、改、查”(CRUD)。在應(yīng)用程序開發(fā)中,從訪問性能、安全性和可擴(kuò)展性等方面考慮,對數(shù)據(jù)庫相關(guān)訪問操作往往是通過ORM框架來實(shí)現(xiàn)。Python社區(qū)生態(tài)中有多種ORM框架,適用于不同的應(yīng)用場景和條件,因此對ORM框架性能進(jìn)行橫向基準(zhǔn)測試分析,在不同的場景需求下選擇適合的ORM框架,對于提升應(yīng)用系統(tǒng)性能具有重要的價值意義。

        1 ?ORM概述

        1.1 ?基本概念

        在沒有ORM框架條件下,如果系統(tǒng)程序需要操作數(shù)據(jù)庫,需要在開發(fā)中編寫原生SQL語句,并通過數(shù)據(jù)驅(qū)動接口模塊遠(yuǎn)程操作數(shù)據(jù)庫,如圖1所示。

        這個數(shù)據(jù)庫操作過程可以概括為以下幾個步驟:

        (1)建立數(shù)據(jù)庫連接,獲得連接對象。

        (2)根據(jù)用戶的操作定義組裝SQL執(zhí)行語句。

        (3)用連接對象執(zhí)行SQL語句,獲得結(jié)果集數(shù)據(jù)對象。

        (4)最后釋放連接資源,關(guān)閉連接對象。

        這種操作流程邏輯復(fù)雜、重復(fù)度高,并存在注入攻擊等安全風(fēng)險問題,系統(tǒng)的設(shè)計也無法做到業(yè)務(wù)與數(shù)據(jù)邏輯分離,不利于降低系統(tǒng)模塊間的緊耦合關(guān)系。在系統(tǒng)開發(fā)中編寫原生SQL語句會存在數(shù)據(jù)庫適配遷移問題,例如針對Oracle開發(fā)的SQL語句無法平移應(yīng)用到其他數(shù)據(jù)庫上,一旦需要遷移改變數(shù)據(jù)庫類型,會在源代碼層級帶來巨大的變更成本。

        1.2 ?ORM作用

        為解決Python系統(tǒng)開發(fā)數(shù)據(jù)庫操作的問題,實(shí)踐中引入了ORM框架的概念。ORM(Object Relational Mapping)即對象關(guān)系映射,通過對各種類型數(shù)據(jù)庫驅(qū)動連接庫進(jìn)行封裝,避免對數(shù)據(jù)庫直接編寫SQL的操作,如圖2所示。

        主要作用表現(xiàn)在以下幾個方面:

        (1)統(tǒng)一訪問接口。通用數(shù)據(jù)庫交互接口是ORM設(shè)計表現(xiàn)核心,使得能夠以統(tǒng)一的方式與各種不同類型的數(shù)據(jù)庫進(jìn)行訪問交互,避免了各種不同數(shù)據(jù)庫SQL語法不同的問題。

        (2)簡化訪問方式。ORM封裝提供了完整的數(shù)據(jù)庫操作細(xì)節(jié)流程,不再需要開發(fā)人員構(gòu)造煩瑣的數(shù)據(jù)庫訪問流程。

        (3)實(shí)現(xiàn)分層模式。ORM解決了面向?qū)ο笤O(shè)計與關(guān)系型數(shù)據(jù)庫的匹配問題,建立了對象與關(guān)系之間的映射框架,是MVC分層模式中的內(nèi)存對象持久化存儲具體實(shí)現(xiàn)方式。

        (4)提高安全特性。由于ORM框架無須用戶自定義拼接SQL語法等操作,從而阻斷了外部的注入攻擊等威脅,提升代碼的安全性。

        1.3 ?ORM模型

        ORM框架中的類對應(yīng)簡稱為模型,模型是數(shù)據(jù)的結(jié)構(gòu)性定義,包含存儲數(shù)據(jù)的字段類型和方法。每個模型都對應(yīng)映射到某個數(shù)據(jù)表,模型中的屬性對應(yīng)數(shù)據(jù)表的字段。以Django ORM為例進(jìn)行CRUD操作示例:

        (1)在ORM框架中操作數(shù)據(jù),必須先創(chuàng)建模型對應(yīng)數(shù)據(jù)庫表。創(chuàng)建示例模型:

        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的方式與數(shù)據(jù)庫交互,操作簡單、簡潔并且開放。在Django中model代表數(shù)據(jù)信息的來源和結(jié)構(gòu),包含了存儲數(shù)據(jù)的重要字段和行為 。通常用一個模型(model)映射到某個數(shù)據(jù)表,建立模型與數(shù)據(jù)存儲之間的關(guān)聯(lián)映射。 Django ORM框架概括起來包括三個方面:

        (1)每個模型都是一個Python類,它是django.db. models.Model的子類。

        (2)模型的每個屬性都代表一個數(shù)據(jù)庫字段。

        (3)Django為用戶提供了一個自動生成的數(shù)據(jù)庫訪問API。

        2.2 ?Peewee

        Peewee是一個輕量級的Python ORM,操作使用直觀。Peewee中一個model類代表一個數(shù)據(jù)庫的表,一個Field字段代表數(shù)據(jù)庫中的一個字段,而一個model類實(shí)例化對象則代表數(shù)據(jù)庫中的一行。Peewee使用主要包括兩部分:

        (1)定義model。在使用的時候,根據(jù)需求先定義好Model,然后可以通過create_tables()創(chuàng)建表,若是已經(jīng)創(chuàng)建好數(shù)據(jù)庫表了,可以通過pwiz腳本工具直接創(chuàng)建model。其中,CharField、DateField、BooleanField等這些類型與數(shù)據(jù)庫中的數(shù)據(jù)類型一一對應(yīng)。

        (2)操作數(shù)據(jù)庫。Peewee中的數(shù)據(jù)模型實(shí)例可以直接進(jìn)行增、刪、改和查的操作。save()對應(yīng)增加數(shù)據(jù);使用delete().where().execute()進(jìn)行刪除,where()是條件、execute()負(fù)責(zé)執(zhí)行語句;使用update().where()進(jìn)行更新數(shù)據(jù);查詢使用select().where(),select()是查詢,where()是條件,get()是獲取第1條數(shù)據(jù)。

        2.3 ?Pony ORM

        Pony ORM提供便捷化的查詢語法,實(shí)現(xiàn)了自動查詢優(yōu)化,提供在線的ORM ER實(shí)體關(guān)系圖編輯器。與Django ORM相比,Pony ORM提供:標(biāo)識映射模式、自動事務(wù)管理、自動緩存查詢和對象、完全支持復(fù)合鍵。Pony ORM支持全自動緩存、讀取速度快,缺點(diǎn)是不支持批量插入。

        2.4 ?SQLAlchemy ORM

        SQLAlchemy ORM是Python中一個使用較為普及的框架庫,具備高性能的數(shù)據(jù)庫訪問設(shè)計,實(shí)現(xiàn)了完整的企業(yè)級持久模型。SQLAlchemy設(shè)計將SQL數(shù)據(jù)庫的量級和性能放在首位,其次是對象集合的抽象。因此SQLAlchemy不同于其他PythonORM框架所采用的Active Record模型,其采用了近似JavaHibernate的數(shù)據(jù)映射模型。在SQLAlchemy中,“增刪改查”操作通過DBSession對象來創(chuàng)建完成。

        2.5 ?Tortoise ORM

        與Python中其他成熟ORM相比,Tortoise ORM是一種異步ORM框架,基于Python中的asyncio異步標(biāo)準(zhǔn)庫實(shí)現(xiàn),支持原生的異步編程。在IO密集型的應(yīng)用場景中,異步處理方式能提極大地升效率,從而彌補(bǔ)Python運(yùn)算性能方面的短板。主要特點(diǎn)包括:

        (1)開發(fā)測試便捷。測試框架使用現(xiàn)有的Python Unittest框架,只需要調(diào)用initializer()和finalizer()來設(shè)置和刪除測試數(shù)據(jù)庫。

        (2)可組合支持Django模型。

        (3)支持多種標(biāo)準(zhǔn)字段。

        (4)支持復(fù)合查詢API。

        3 ?性能測試方法

        3.1 ?基本條件

        ORM性能測試的首先要考慮以下幾個基本條件:

        (1)ORM框架至少支持2個以上的數(shù)據(jù),例如MySQL、SQLite。

        (2)框架運(yùn)行環(huán)境為Python 3.7。

        (3)框架處于積極更新維護(hù)中。

        (4)能夠生成指定模型的初始DDL。

        (5)處理一對多關(guān)系。

        3.2 ?測試基準(zhǔn)

        3.2.1 ?測試內(nèi)容

        測試內(nèi)容包括幾個方面內(nèi)容:

        (1)插入:單條插入(IS),批量插入(IBH),批量導(dǎo)入(IBK)。

        (2)過濾:大量數(shù)據(jù)過濾(FL),少量數(shù)據(jù)過濾(FS),字典過濾(FD),元組過濾(FT)。

        (3)更新:整個結(jié)構(gòu)數(shù)據(jù)更新(UW),部分字段數(shù)據(jù)更新(UP)。

        (4)刪除:按過濾條件刪除(DL)。

        (5)查詢:按過濾條件查詢(GS)。

        3.2.2 ?測試數(shù)據(jù)表

        測試操作的數(shù)據(jù)表包括三種:無關(guān)聯(lián)關(guān)系小型表、有關(guān)聯(lián)關(guān)系小型表、大型表:

        (1)無關(guān)聯(lián)關(guān)系小型表(small_table_nr)如表1所示。

        (2)有關(guān)聯(lián)關(guān)系小型表(small_table_wr)如表2所示。

        (3)大型表(large_table)如表3所示。

        3.3 ?測試結(jié)果

        3.3.1 ?SQLite測試結(jié)果

        SQLite測試數(shù)據(jù)結(jié)果如表4所示,Peewee和Pony ORM有顯著的性能提升,SQLAlchemy和Django ORM性能表現(xiàn)近似,Tortoise ORM讀取速度慢,創(chuàng)建、更新和刪除操作速度較快。

        3.3.2 ?MySQL測試結(jié)果

        MySQL測試數(shù)據(jù)結(jié)果如表5所示,Peewee和Tortoise ORM有較好的性能表現(xiàn),Pony ORM性能表現(xiàn)相對更快,SQLAlchemy和Django ORM操作速度則表現(xiàn)相對更慢。

        4 ?結(jié) ?論

        通過測試數(shù)據(jù)結(jié)果分析,總體來說Pony ORM具有高度優(yōu)化的性能表現(xiàn),Django ORM 和SQLAlchemy在性能上表現(xiàn)上相似相近。Tortoise ORM由于采用了異步框架支持,避免了IO讀寫上的等待時間耗費(fèi),具有十分出色的性能表現(xiàn)。Python異步框架對于提升數(shù)據(jù)庫相關(guān)操作效率具有十分重要的意義,融合異步技術(shù)將是Python ORM框架發(fā)展重點(diǎn)方向。

        參考文獻(xiàn):

        [1] 楊立苑,李芬,周雪瑩,等.面向氣象Web應(yīng)用的數(shù)據(jù)庫訪問性能優(yōu)化及應(yīng)用 [J].計算機(jī)與數(shù)字工程,2020,48(11):2671-2676.

        [2] 熊學(xué)鋒,彭小慶,曹鑫.基于改進(jìn)ORM的Oracle數(shù)據(jù)庫異構(gòu)資源整合方法研究 [J].電子設(shè)計工程,2020,28(21):38-41+46.

        [3] 蹇常林.ORM在Django操作數(shù)據(jù)庫中的應(yīng)用 [J].技術(shù)與市場,2020,27(1):56-57.

        [4] 郭顯娥.Django實(shí)現(xiàn)ORM模型數(shù)據(jù)查詢優(yōu)化 [J].山西大同大學(xué)學(xué)報(自然科學(xué)版),2019,35(3):27-31+36.

        [5] 熊偉,歐陽逸,張凌云.一種數(shù)據(jù)庫訪問代碼自動生成方法 [J].廣州大學(xué)學(xué)報(自然科學(xué)版),2019,18(3):93-95.

        [6] 陳忠菊.基于SQLAlchemy的研究和在數(shù)據(jù)庫編程中的應(yīng)用 [J].電腦編程技巧與維護(hù),2015(1):62+85.

        [7] 郎芳.基于Django技術(shù)的自動化測試工具設(shè)計與實(shí)現(xiàn) [D].西安:西安電子科技大學(xué),2012.

        作者簡介:賀宗平(1982.09—),男,漢族,江蘇南京人,工程師,碩士,主要研究方向:軟件體系架構(gòu)、數(shù)據(jù)平臺。

        猜你喜歡
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        財經(jīng)(2017年15期)2017-07-03 22:40:49
        數(shù)據(jù)庫
        財經(jīng)(2017年2期)2017-03-10 14:35:35
        數(shù)據(jù)庫
        財經(jīng)(2016年15期)2016-06-03 07:38:02
        數(shù)據(jù)庫
        財經(jīng)(2016年3期)2016-03-07 07:44:46
        數(shù)據(jù)庫
        財經(jīng)(2016年6期)2016-02-24 07:41:51
        數(shù)據(jù)庫
        財經(jīng)(2010年20期)2010-10-19 01:48:32
        日本人妻精品有码字幕| 放荡的闷骚娇妻h| 亚洲av永久无码国产精品久久| 欧美成人精品一区二区综合| 99JK无码免费| 亚洲av高清资源在线观看三区| 国产精品国产三级国a| 亚洲综合中文字幕日韩 | 无码孕妇孕交在线观看| 亚洲综合国产一区二区三区| 99re久久精品国产| 国产免费久久精品99re丫y| 亚洲熟妇夜夜一区二区三区| 亚洲综合视频一区二区| 麻豆国产一区二区三区四区| 久久99精品久久久久久9蜜桃| 精品乱码一区二区三区四区| 蜜桃一区二区三区在线看| 61精品人妻一区二区三区蜜桃| 亚洲高清一区二区三区在线播放| 精品国际久久久久999波多野| 狠狠色成人综合网| 日本一区二区不卡视频| 欧美1区二区三区公司| 邻居少妇张开腿让我爽视频| 国产高清乱码又大又圆| 青草内射中出高潮| 美女扒开内裤让男生桶| 蜜桃av无码免费看永久| 亚洲中字永久一区二区三区| 强开小婷嫩苞又嫩又紧视频| 色橹橹欧美在线观看视频高清| 久久亚洲国产精品成人av秋霞| 宅男久久精品国产亚洲av麻豆| 日韩av一区二区不卡在线| 爽爽影院免费观看| 国产亚洲精品久久久久久| 99国产精品丝袜久久久久| 丝袜美腿一区二区在线观看 | 一女被多男玩喷潮视频| 国内精品一区二区三区|