<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > 作者:Michael Bayer > 譯者:謝路云 > 狀態:翻譯中 > 原文地址:[http://www.aosabook.org/en/sqlalchemy.html](http://www.aosabook.org/en/sqlalchemy.html) SQLAlchem??y是一個Python語言的數據庫工具包和關系對象映射(ORM)系統,始于2005年。從一開始,它就力求通過Python的數據庫API(即DBAPI)提供一種和關系數據庫交互的端對端系統。從早期的版本開始,SQLAlchemy的功能就吸引了很多人的注意力。它的主要特性包括能夠流暢的表達復雜的SQL查詢和對象映射,以及實現了"Unit of Work"模式來高度自動化的完成數據在數據庫中的持久化。 從一個渺小而粗糙的概念性實現開始,SQLAlchemy迅速經歷了一系列蛻變和打磨。隨著用戶群的增長,內部架構和公共API也在不斷的迭代。到了2009年一月發布0.5版本之時,SQLAlchemy已經在大量的生產環境中部署并證明了自己,并開始穩定下來。0.6(2010年四月)和0.7(2011年五月)兩個版本對架構和API的改進使我們成為了最高效和最穩定的第三方庫。截至撰寫本文之時,大量不同領域的組織都在使用SQLAlchem??y。它已經被大家認可并事實上成為使用Python操作關系型數據庫的標準庫。 ## 20.1.數據庫抽象層的挑戰 “數據庫抽象層”通常指的是一種用來和數據庫通訊并隱藏數據的存儲和查詢的大部分細節的系統。對這個詞的理解有時會走向一個極端,認為這樣的系統應該隱藏的不僅是所使用的關系數據庫的細節,還應該包括數據的關系結構,甚至不再關心底層的存儲機制是否是基于關系的。 對于ORM最常見的批評認為以上就是這種工具的最主要目的——把關系數據庫“藏起來”,接管和數據庫的交互并將它們轉化為實現的細節。這種方式的核心意義在于將設計和查詢關系數據結構的工作從開發者轉移到一個不透明的第三方庫中。 經常和關系數據庫打交道的人都知道,這種認識完全是不切實際的。關系結構和SQL查詢都是功能性的,它們組成了一個應用程序設計的核心。應該如何在查詢中設計、組織和操作這些結構不僅取決于要查詢哪些數據,也取決于數據的結構。如果連這些信息都要隱藏起來,那么也就根本沒有使關系數據庫的必要了。 既要滿足應用程序屏蔽底層關系數據庫復雜性的期望,又要滿足使用關系數據庫所必要的繁復,這種矛盾被稱為“對象-關系的阻抗不匹配”問題。SQLAlchem??y采用了一些新穎的方法來解決這個問題。 *SQLAlchem??y的數據庫抽象層* SQLAlchem??y認為開發人員必須要考慮他或者她的數據的關系形式。預判并隱藏數據庫schema和查詢的系統所設計的行為只會降低使用關系數據庫的必要性,進而導致阻抗不匹配所帶來的一系列經典問題。(*) 但同時,這些行為的實現應該也必須執行在一個盡可能高的層次上。將一個對象模型和一個schema關聯起來并通過SQL語句將對象持久化是一項重復性極高的任務。使用工具來將這些任務自動化才能開發出更加簡潔、高效和強大的應用程序。而手動實現這些操作的應用程序所需的開發時間將會是它的數倍。(*) 因此,SQLAlchemy對自己的定位是一個工具包 ,這是為了強調開發者才是所有關系結構以及這些結構和應用程序之間的聯系的設計者和構造者,而不是第三方庫的盲目使用者。通過開放“關系”,SQLAlchem??y實現的理念是“不完全抽象”,(*)它不利開發者在應用程序和關系數據庫之間自定義一個自動化的交互層。SQLAlchem??y的創新在于它能夠在不犧牲對關系數據庫的控制能力的前提下做到高度的自動化。 ## 20.2.兩個世界:核心層(Core)與對象關系映射層(ORM) 為了達到工具包這個目標,SQLAlchem??y將與數據庫交互的每一層都開放成為了一組成熟的API,這產生了兩種主要的交互方式,分別是核心層(Core)和對象關系映射層(ORM)。核心層負責和Python的數據庫API(DBAPI)的交互、拼接數據庫能夠理解的SQL語句并管理schema。這些功能都對應著公開的API。 圖20.1的SQLAlchem??y的層圖 核心/ ORM SQLAlchem??y的分離一直是最本質的特征,它既有優點和缺點。目前在SQLAlchem??y的明確的核心導致ORM到關系數據庫映射類的屬性結構被稱為一個Table ,而不是直接將其字符串表示在數據庫中的列名,產生一個SELECT查詢使用結構稱為select ,而不是拼湊對象的屬性直接轉換成字符串聲明和接收結果行通過的的門面被稱為ResultProxy ,透明映射的select 每個結果行,而不是將數據直接從數據庫游標一個用戶定義的對象。 核心元素的一個非常簡單的ORM為中心的應用程序是不可見的。但是,為核心的精心整合的ORM,讓流動的過渡在ORM和核心之間的結構,更復雜的ORM為中心的應用可以“向下移動”,以便處理與數據庫中的更多的水平或兩個具體和微調的方式,隨著形勢的需要。SQLAlchem??y的有成熟,核心API已經變得不那么明確經常使用的ORM繼續提供更復雜和更全面的圖案。但是,核心的可用性也是一個貢獻SQLAlchem??y的早期成功的,因為它允許早期的用戶來完成,更比可能的ORM仍在發展。 的ORM /核心方法的缺點是,指示必須穿越更多的步驟。Python的傳統的C實現有一個顯著的開銷處罰為獨立的功能調用,這是主要原因在運行時緩慢。傳統方法的改善這包括縮短呼叫通過重排鏈和內聯與C代碼,并更換性能的關鍵領域。SQLAlchem??y的已經花了多年使用這兩種方法提高性能。然而,越來越多的人接受的PyPy為Python解釋器可壁球余下的承諾性能問題,而不需要更換的多數SQLAlchem??y的內部結構與C語言代碼,PyPy大大剛剛在時間的調用鏈長通過減少的影響內聯和編譯。 ## 20.3馴服DBAPI 在該基地的SQLAlchem??y的是一個系統與數據庫進行交互,通過DBAPI。DBAPI本身是不是一個實際的庫,只有規范。因此,實現的DBAPI是可用于特別是目標數據庫,如MySQL或PostgreSQL,或者特別是非DBAPI,如ODBC和JDBC數據庫適配器。 的DBAPI提出了兩方面的挑戰。第一是提供一種易于使用且功能齊全的門面周圍的DBAPI的最基本的使用模式。二是要處理的變量的性質具體的DBAPI的實現,以及底層的數據庫引擎。 方言系統 由DBAPI接口是非常簡單的。其核心部件DBAPI模塊本身,連接對象,并且將光標對象的“光標”數據庫中的說法表示的上下文中特別聲明以及其相關的結果。一個簡單的互動與這些對象連接和檢索數據庫中的數據如下: 連接= dbapi.connect(用戶=“用戶”,PW =“私服”,主機=“主機”)光標通過connection.cursor()cursor.execute(“SELECT * FROM user_table,其中name =?”(“杰克”,))打印列在“結果:”,說明[0],描述在cursor.description]為排在cursor.fetchall():打印的“行”,行cursor.close()connection=close SQLAlchem??y的創建一個門面周圍的經典DBAPI談話。“點進入這個門面是create_engine電話,組裝連接和配置信息。一個實例作為結果產生的Engine 。該對象,然后網關DBAPI,這本身是永遠不會直接暴露。 對于簡單的語句執行, Engine提供什么被稱為隱式執行接口。本工作?獲取和關閉一個DBAPI連接和光標在后臺處理: 引擎create_engine(“與postgresql :/ /用戶名:密碼:主機/數據庫”)結果engine.execute(“select * from表”)或打印result.fetchall(0) SQLAlchemy的0.2的Connection對象補充說,提供的能力顯式地維護范圍的DBAPI連接: 康恩= engine.connect()專題專題查詢欄目位置(“select * from表”)或打印result.fetchall(0)conn.close() 返回的結果的execute方法的Engine 或Connection被稱為ResultProxy ,它提供了類似的DBAPI光標,但具有更豐富的接口行Engine ,Connection ,并ResultProxy對應于DBAPI一個特定的模塊,例如DBAPI連接,和一個實例的一個特定的DBAPI光標。 在幕后, Engine引用的對象所謂的Dialect 。Dialect是一個抽象的類存在許多實現的,每一個有針對性的在一個特定的的DBAPI /數據庫組合。創建一個ConnectionEngine代表將參照這個Dialect 可用于所有的決定,這取決于使用的目標的DBAPI和數據庫可能具有不同的行為。 該Connection創建時,從一個倉庫,采購和維護的實際DBAPI連接被稱為一個Pool ,還與Engine相關聯的。Pool是負責創建新DBAPI連接的,通常情況下,他們保持經常重復使用的內存池。 在語句執行期間,一個附加的對象被稱為ExecutionContext創建的Connection 。持續的對象點執行的ResultProxy的整個生命周期。很顯然,那位同事是位多產教案,列表名單很大,所以教師選擇更先進的搜索,并增加了也可以提供作為一個特定的子類的一些DBAPI /數據庫的組合。 圖20.2說明了所有這些對象及其關系到每個以及其他的DBAPI組件。 圖20.2:發動機,連接,ResultProxy API 處理DBAPI變異 對于任務的管理DBAPI行為的變化,首先我們考慮問題的范圍。在DBAPI在第二版規范,目前,寫的是一個系列API定義,允許廣泛的變異程度行為,并留下一個不確定的領域。其結果是,現實生活中的DBAPIs表現出很大程度的變化在若干領域,包括當Python如何unicode字符串是可以接受的,當他們都沒有;“最后插入的ID” - 這是一個自動生成的主鍵可能是收購后的INSERT語句,以及如何綁定參數值可以指定和解釋。他們也有大量面向類型的特質的行為,包括二進制處理,精度數值,日期,布爾和Unicode數據。 SQLAlchemy的接近允許在這兩個Dialect變化和ExecutionContext通過多層次的子類。如圖20.3所示Dialect之間的關系和ExecutionContext時用于與psycopg2的方言。PGDialect類的行為,特定的PostgreSQL數據庫的使用,如ARRAY數據類型和架構目錄; PGDialect_psycopg2 類,然后提供特定的psycopg2的DBAPI的行為,包括Unicode數據處理程序和服務器端游標的行為。 圖20.3:簡單的方言/的ExecutionContext層次 上述模式的一個變體提出了自己在處理一個DBAPI支持多個數據庫。這方面的例子包括pyodbc,其中涉及任意數量的后端數據庫通過ODBC,和一個Jython與JDBC驅動程序,其中涉及zxjdbc,。以上關系是增加了一個mixin類,從在使用sqlalchemy.connectors包提供DBAPI的行為,是常見的多個后端。圖20.4說明了常見的功能sqlalchemy.connectors.pyodbc之間共享MySQL和Microsoft SQL Server的的pyodbc特定方言。 圖20.4:普通DBAPI方言層次之間共享的行為 Dialect ExecutionContext對象提供了一種手段定義與數據庫和DBAPI每一次互動,包括如何連接參數的格式和如何特殊在語句執行期間被處理的怪癖。的Dialect 也是一個SQL編譯結構,使工廠SQL正確的目標數據庫,和類型的對象定義Python的數據應如何封從目標DBAPI和數據庫。 20.4。架構定義 建立與數據庫的連接和交互性,接下來的任務提供創建和操縱的后端無關SQL語句。要做到這一點,首先,我們需要確定我們將如何參照的表和列呈現在一個數據庫中的所謂的綱目表和列代表數據是有組織的,和大多數的SQL語句組成的表達式,參照這些結構的命令。 一個的ORM或數據訪問層需要提供編程訪問SQL的語言,在該基地是一個編程的系統描述表。這是SQLAlchem??y的核心提供了第一個強大的部門ORM,提供的Table和Column的結構描述數據庫的結構獨立于用戶的模型類確定目標背后的分工模式定義對象關系映射的關系架構可以設計明確的關系型數據庫,包括特定于平臺的沒有被混亂的對象 - 關系的概念,這些細節,如果有必要,仍然是一個單獨的關注。作為獨立的的ORM成分也架構描述系統是一樣有用的任何其他類型的對象 - 關系系統可建立在核心。 Table和Column模型屬于的范圍是什么被稱為元數據 ,提供一個集合對象的MetaData來表示Table對象的集合。這種結構來源于Martin Fowler的描述大多來自“元數據映射”企業應用架構模式 。圖20.5所示一些關鍵要素的sqlalchemy.schema包。 圖20.5:基本sqlalchem??y.schema的對象 Table代表一個實際的表的名稱和其他屬性目前在目標模式。它的Column對象的集合代表命名并鍵入有關單個表列的信息。一個完整的數組對象的描述約束,索引和序列設置,以填補在有更多的細節,其中一些影響的引擎和SQL施工系統行為。特別是, ForeignKeyConstraint 是中央確定兩個表中應加入。 架構中的包Column Table和Column相對于其余的是唯一的包,因為它們是雙繼承,無論從sqlalchemy.schema包,sqlalchemy.sql.expression包,服務不只是為模式水平結構,但也可作為核心的SQL表達式語言的語法單位。圖20.6中示出這種關系。 圖20.6:表和列的雙重生活 在圖20.6中,我們可以看到, Table和Column繼承的SQL世界具體形式“的東西,你可以選擇”,被稱為一個FromClause ,和“東西,你可以使用SQL表達式”,被稱為一個ColumnElement 。 20.5SQL表達式 在SQLAlchem??y的創作中,SQL生成的方法是不明確的。文本語言可能是一個可能的候選人,這是一種常見的方法是在知名的核心對象 - 關系的工具像Hibernate的HQL。然而,對于Python,更有趣的選擇是:使用Python對象和表達式generatively建設的表達式目錄樹結構,甚至利用Python的運營商,所以運營商可以給定的SQL語句行為。 雖然它可能不會一直是這樣做的第一個工具,全歸功于在伊恩的SQLBuilder庫Bicking SQLObject來的靈感系統的使用Python對象和運營商SQLAlchem??y的表達語言。在這種方法中,Python對象代表一個SQL的詞匯部分表達。在這些對象上的方法,以及重載運算符,產生新的詞匯結構來源于它們。最常見的目的是“列”將代表這些對象SQLObject的一個ORM映射類.q屬性可以通過使用一個命名空間;SQLAlchemy的命名屬性.c 。的.c 屬性今天仍然是核心的可選元素,如表和select語句。 表達式樹 一個SQLAlchem??y的SQL表達式結構,這種結構是非常你,如果你想創建解析SQL語句,它是一個解析樹,除了開發人員創建的解析樹直接,而不是它從一個字符串導出。的核心類型的節點,在該解析樹被稱為的ClauseElement , 圖20.7示出的關系ClauseElement一些關鍵類。 圖20.7:基本表達層次 通過使用構造函數,方法和重載的Python操作功能,這樣的語句結構為: SELECT ID FROM用戶,其中name =? 可能建造在Python中,如: 從導入表中sqlalchem??y.sql,列中,選擇用戶表('用戶'('身份證'),列,列(“名稱”))到stmt =選擇(user.c.id])。(user.c.name =='編輯') 在select 圖20.8中示出的結構的上述select構造。注意:表示包含的文本值'ed'內_BindParam構造,從而導致它被呈現為綁定參數標記的SQL字符串使用一個問號。 圖20.8:例表達式樹 從樹形圖中,人們可以看到,通過一個簡單的降穿越節點可以快速創建一個呈現的SQL語句,我們會看到更細節一節中的語句編譯。 Python的操作方法 在SQLAlchem??y,這樣的表達式: 列('A')== 2 生產既不True也不False ,而是一個SQL表達式興建。 關鍵是使用Python特殊的重載操作符操作員功能:例如,方法如**eq**?,?**ne**?,**le**?,?**lt**?,?**add**?,?**mul**?。面向列表達式節點提供重載通過使用Python的操作人員的行為一個mixin ColumnOperators 。使用操作符重載,一個表達column('a') == 2等價于: 從sqlalchem??y.sql.expression進口_BinaryExpression從進口柱sqlalchem??y.sql,bindparam,距離sqlalchem??y.operators進口EQ _BinaryExpression(左=('a')的列中,右= bindparam('A',值= 2,獨特的= TRUE),=操作符式) eq結構實際上是一個函數從Python的內置的operator 。代表運營商作為一個對象(例如,operator.eq ),而不是一個字符串(即, = )允許字符串表示定義在語句的編譯時間,當數據庫方言信息是已知的。 精選集 負責渲染成文本的SQL表達式樹的中央級SQL是Compiled類。這個類有兩個主要的子類, SQLCompilerDDLCompiler 。SQLCompiler處理SQL的渲染操作為SELECT,INSERT,UPDATE和DELETE語句,統稱為數據查詢語言(DQL)DML(數據操縱語言),而DDLCompiler處理各種CREATE和列為DROP語句,數據定義語言(DDL)。有一個額外的類層次結構,重點圍繞字符串表示形式的類型,開始在TypeCompiler 。個人方言然后提供自己的所有三個編譯器類型的子類定義特定的目標數據庫的SQL語言方面。圖20.9提供了一個相對于這個類層次的概述PostgreSQL的話。 圖20.9:編譯器的層次結構,包括PostgreSQL的具體實施 Compiled的子類定義了一系列的訪問方法,每個一提到一個特定的子類的ClauseElement 。層次結構ClauseElement節點的一份聲明中行走,是通過每次訪問函數的遞歸連接的字符串輸出。由于這個收益, Compiled對象維護國家有關匿名標識符名稱,綁定參數名稱,嵌套子查詢,除其他事項外,所有的生產的SQL語句的字符串,以及作為最終目的收集綁定的參數使用默認值。圖20.10說明訪問方法的過程中,在文本單元。 圖20.10:呼叫層次的語句編譯 一個完成的Compiled結構包含完整的SQL字符串,并綁定值的集合。這些都是強制的ExecutionContext到DBAPI的execute預期的格式 方法,其中包括這樣的考慮,治療的Unicode語句對象的集合類型使用存儲綁定值,以及具體如何綁定值自己應該被強迫交涉適當的DBAPI目標數據庫。 20.6類映射的ORM 現在我們的注意力轉移到ORM。第一個目標是使用系統表的元數據中,我們定義了允許一個用戶定義的類映射到數據庫表中的列的集合。第二個目標是讓用戶定義的類之間的關系的定義,根據數據庫中的表之間的關系。 SQLAlchem??y的“映射”,是指這眾所周知的數據映射器模式描述在福勒的企業架構模式 。總體而言,SQLAlchem??y的ORM大量借鑒由福勒的做法詳細介紹。它也嚴重影響了著名的Java關系映射工具Hibernate和伊恩Bicking為Python的SQLObject的產品。 古典與聲明 我們使用的術語古典映射到參考SQLAlchemy的系統的應用對象 - 關系數據映射到一個現有的用戶類。這形式參考Table對象和用戶定義的類有兩個單獨定義的實體連接在一起,通過一個函數調用對映表,一旦mapper已應用到一個用戶定義的類,類需要新的屬性對應表中的列: 類用戶(對象):通過 映射(用戶user_table) #現在用戶有一個“id”屬性用戶名 mapper也可以貼上其他各種屬性的類,包括屬性對應于其他種對象的引用,以及為任意的SQL表達式。粘貼任意屬性的過程中一類是被稱為在Python世界為“的monkeypatching”的,但由于我們是在數據驅動的和非任意的方式,這樣做的精神,操作的更好地表達這個術語類儀器儀表 。 現代使用的SQLAlchem??y的中心,周圍的聲明的擴展,這是一種可配置的系統,類似于共同有效記錄系統所使用的許多其他類的聲明對象 - 關系的工具。在這個系統中,最終用戶明確定義屬性內聯類的定義,每個代表一個屬性類,它是要被映射的。Table對象,在大多數情況下,是不明確提到,也不是mapper功能,只有類,Column對象,與其他ORM相關的屬性被命名為: 類用戶(基本):**tablename**?='用戶'ID =列(如Integer,primary_key的= TRUE) 它可能會出現,上面的類儀器直接實現由我們的放置id = Column()但這種情況并非如此。的聲明擴展使用Python元類,這是一個方便的方法來執行一系列的操作,每次一個新的類首先聲明,生成一個新的Table 從什么被宣布的對象,并通過它的mapper功能,隨著類。mapper功能,然后在完全相同的方式,它的工作修補它自己的屬性類上,在這種情況下向id屬性,和更換有以前。元類初始化的時候是完整的(也就是,當執行的流程離開由User劃定的塊),標記的id Table User.id Column對象被移動到一個新的Table , User.id 已被替換特定映射由一個新的屬性。 它總是SQLAlchem??y的將有一個的簡寫,聲明的形式配置。然而,創造的聲??明延遲贊成繼續工作,鞏固了力學的經典測繪的。中期的擴展名為ActiveMapper,這后來成為藥劑項目,早在存在。它重新定義映射構造在一個更高的級別申報制度。聲明的目標是扭轉藥劑的大量抽象的方向通過建立一個系統的方法保留SQLAlchem??y的經典地圖繪制概念,幾乎確切地說,只有重組它們是如何使用不再繁瑣,更適合類級別的擴展比經典的映射。 無論是古典或聲明的映射,映射的類需要新的行為,允許它來表達其屬性中的SQL結構。SQLAlchem??y的最初跟著SQLObject的使用一個特殊的行為通過SQLAlchem??y的屬性為SQL列表達式的來源,提到.c ,在這個例子中: 結果= session.query(用戶)。過濾器(User.c.username =='編輯')。所有的() 然而,在0.4版本中,SQLAlchem??y的移動到映射的功能屬性本身: 結果= session.query(用戶)。過濾器(User.username =='編輯')。所有的() 在屬性的訪問證明了這種變化有很大的改進,因為它寵物的列狀的物體目前的類,以獲得額外的類特定的功能目前來自直接從底層Table對象。很顯然,那位同事是位多產教案,列表名單很大,所以教師選擇更先進的搜索,并增加了也允許使用不同的類屬性之間的整合,如直接指到表列的屬性,屬性,來自這些列的SQL表達式和屬性,請參閱相關的類。最后,它提供了一個對稱之間的映射類,同樣的屬性,以及該映射的類的實例,可以采取不同的行為取決于類型的父。綁定類屬性返回SQL表達式,同時結合實例屬性返回實際的數據。 映射的剖析 一直連接到我們的id User類的id屬性,是一種在Python中的對象,對象為一個描述符有**get**?,?**set**,和**del**方法,它的Python運行時按照所有涉及該屬性的類和實例操作。SQLAlchemy的實施稱為一個InstrumentedAttribute ,我們將舉例說明背后所呈現的世界與另一個例子。從一個Table和一個用戶定義的類,我們建立了一個映射只有一個映射列relationship ,以及相關的類,它定義了一個參考: user_table表(“用戶”,元數據,列('身份證',整數,primary_key的= TRUE),) 類用戶(對象):通過 映射器(用戶,user_table,屬性= {“相關”的關系(地址)}) 當映射的結構是完整的,有關的類的對象的詳細的圖20.11中。 圖20.11:映射的剖析 該圖說明了SQLAlchem??y的映射定義為兩個獨立的層用戶定義的類和表的元數據之間的互動,它被映射。圖向左類儀器儀表,而SQL和數據庫功能是朝著正確的合照。一般模式玩的是對象的組合是用來隔離行為的角色和對象繼承用來區分在一個特定的角色之間的行為差??異。 類儀器儀表領域內, ClassManager被映射的類,而其收集的InstrumentedAttribute對象是與每個屬性映射的類。InstrumentedAttribute是面向公眾的Python的描述符前面提到的,產生SQL表達式時,使用基于類的表達式(例如, User.id==5 )。.在...時候, 何時處理的一個實例User , InstrumentedAttribute代表的行為歸因于AttributeImpl對象,這是一個專門對幾個品種所表示的數據類型。 建立的映射側, Mapper代表一個用戶定義的類和一個可選擇的單元的聯動,最典型的Table 。Mapper維護一組每個屬性的對象,被稱為為MapperProperty ,其中涉及的SQL表示的特定屬性。最常見的變種MapperProperty ColumnProperty ,一個映射的字段或SQL表達式,并RelationshipProperty ,代表一個連接到另一個映射。 MapperProperty代表屬性裝載行為,包括屬性如何呈現在一個SQL語句,以及如何從結果來填充行一個LoaderStrategy對象,其中有幾個品種。不同LoaderStrategies確定的裝載行為,屬性被延遲 , 躍躍欲試 ,或直接 。選擇默認的版本映射配置時間,在查詢時可以選擇使用一個備用的策略。RelationshipProperty也的引用了DependencyProcessor ,處理,如何映射器間的依賴關系和屬性同步進行沖洗時間。父和目標的關系幾何形狀的基礎上選擇DependencyProcessor selectables鏈接關系。 的的Mapper / RelationshipProperty結構形成一個圖,其中Mapper對象的節點RelationshipProperty對象的有向邊。一旦全套映射器已被宣布由一個應用程序,遞延“初始化”步驟被稱為組態前進。它主要用于每個RelationshipProperty ,以鞏固其母公司和細節之處的目標映射器,包括選擇的AttributeImpl以及作為DependencyProcessor 。此圖是一個關鍵的數據結構,用于整個操作過程中的ORM。它參與操作,如所謂的“級聯”的行為,定義了如何操作應該傳播沿著對象的路徑,查詢操作相關的對象和集合“眼巴巴”加載一次,以及對對象沖洗側一個之前建立的所有對象引發了一系列的依賴圖持久性的步驟。 20 / 7查詢和裝載行為 SQLAlchemy的啟動通過一個對象調用Query所有對象的裝載行為。基礎狀態Query開始,包括實體 ,這是映射類列表和/或獨立的SQL表達式進行查詢。它也有一個參考Session ,它表示連接到一個或多個數據庫,以及一個高速緩存的數據的相對于累計這些連接上的交易。下面是一個基本的用法示例: 從sqlalchem??y.orm導入Session屆會議(發動機)查詢session.query(用戶) 我們創建了一個Query ,將產生的User情況下,相對于一個新的Session ,我們已經創建。在同一Query提供了一個生成生成器模式select結構的方式前面所討論的,額外的標準和修飾符與在一份聲明中構造一個方法調用的時間。當一個迭代運算被稱為上的Query ,它構造一個SQL表達式構造代表一個SELECT,把它發射到數據庫中,然后解釋的結果集行面向ORM的結果對應于所請求的實體的初始集合。 Query進行硬的SQL渲染的區別 和數據加載的操作的部分。前者是指建設一個SELECT語句,后者的解釋SQL結果行ORM映射的構造。數據加載,其實,繼續進行沒有一個SQL呈現步驟,的Query可能會被要求解釋結果一個文本查詢手由用戶組成。 這兩個SQL渲染和數據加載利用遞歸下降形成的曲線圖由一系列鉛Mapper對象,考慮每一列或SQL表達式控股ColumnProperty作為一個葉子結點,每個這是通過所謂的“急切負荷”要包含在查詢中的RelationshipProperty作為一個邊緣到另一個Mapper節點。遍歷和要采取的行動,在每個節點最終是每個LoaderStrategy與每MapperProperty相關工作,添加列,并加入到正在興建的SELECT語句在SQL呈現階段,Python函數來處理結果行中的數據加載階段。 Python函數中的數據加載階段,每個接收數據庫中的一行,因為它們是牽強,產生的狀態可能有變在存儲器中的映射的屬性作為一個結果。它們產生的一個特定的屬性有條件的,根據檢查結果集的第一個入行,以及加載選項。如果負載的屬性是不繼續進行,沒有可調用的函數。 圖20.12說明了遍歷幾個LoaderStrategy對象中加入的渴望加載 情況下,說明其提供的SQL語句的連接過程中發生的_compile_context 方法Query 。這也表明新一代的的行人口的功能,收到的結果行和填充單個對象的屬性,這個過程發生在instances的Query方法。 圖20.12:穿越的裝載機的戰略,包括一個加入預先加載 SQLAlchem??y的早期結果來填充方法使用傳統的穿越固定對象的方法與每一個收到的每一行的戰略和采取相應的行動。加載程序可調用的系統,首先在0.5版本中引入的,代表一個巨大的飛躍,性能,因為很多決策就行可以了只是一次處理了前面,而不是為每一行,和一個顯著數量的函數調用沒有凈影響可能會被淘汰。 20.8會議/標識映射 在SQLAlchem??y,Session對象的實際使用情況,提出了公共接口ORM的,也就是說,加載和持久化數據。它提供的起始角度為給定的數據庫連接查詢和堅持行動。 Session ,除了作為數據庫連接的網關,這是目前所有映射實體的集合保持一個積極的參考在內存中相對于該Session 。在這樣的Session 的身份地圖和單位的工作模式,既實現了一個門面確定由福勒。一個數據庫唯一的身份標識映射保持映射為一個特定的Session中的所有對象,消除了存在的問題重復的身份介紹。工作單位的基礎上的身份地圖提供的持久化狀態的變化過程自動化系統數據庫中的盡可能最有效的方式。實際的持久性步驟是被稱為“沖洗”,和在現代的SQLAlchem??y此步驟通常是自動的。 發展歷史 Session開始大多隱蔽系統負責單散發出齊平的任務。沖洗過程中涉及發光SQL報表到數據庫中,對應的對象的狀態中的變化跟蹤工作制的單位,從而同步的當前狀態在內存中的數據庫。的沖洗一直是一個最SQLAlchem??y的復雜的操作。 方法的調用非常早期版本的同花順開始在背后被稱為commit ,這是方法上存在一個隱式的,線程局部對象objectstore 。當一個人使用SQLAlchem??y的0.1,因此沒有必要打電話Session.add ,也沒有任何一個明確的概念Session的。唯一的面向用戶的步驟是創建映射器,創建新的對象,修改現有對象加載查詢(查詢每個Mapper對象直接從自己被調用),然后堅持所有通過objectstore.commit命令。池中的對象的一組操作無條件模塊全局的和無條件的線程局部。 與第一組objectstore.commit模型是直接命中的用戶,但此模型的剛性很快撞上了墻。現代SQLAlchem??y的新用戶有時感嘆,需要定義一個工廠,可能是注冊表,Session對象,以及需要保持自己的對象組織成只是一個Session的時間,但是這是遠遠最好的初期,當整個系統完全是隱含的。“0.1使用模式的方便,在很大程度上仍是在現代社會本SQLAlchem??y的,其特點通常配置為一個會話注冊表使用線程局部范圍。 Session本身只介紹SQLAlchemy的0.2版,建模后在Hibernate Session對象存在松散。這個版本的特色綜合事務控制,其中的Session可以被放置到一個事務中通過begin方法,并完成通過commit方法。objectstore.commit方法更名為objectstore.flush ,新的Session對象可以在任何時間創建。Session本身被打破了從另一個對象UnitOfWork ,這仍然是一個私人反對負責執行實際的刷新操作。 ,雖然沖洗過程中顯式調用方法用戶,0.4系列的SQLAlchemy的概念引入的自動刷新 ,這意味著,刷新每次查詢前立即發出。它的優點自動刷新的是,所發出的SQL語句的查詢總是有關系側訪問的確切狀態,存在于存儲器中,所有的改變都送了過來。早期版本的SQLAlchem??y的不包括此功能,因為最常見的使用模式FLUSH語句也承諾永久性的變化。但是,當自動刷新據介紹,它是伴隨著另一個特點所謂的事務性 Session ,它提供了一個Session會自動啟動的交易中,一直持續到用戶名為commit明確。此功能的推出, flush方法不再犯,它刷新的數據,并能安全被稱為一個自動化的基礎上。Session ,而現在,提供了一步一步的同步內存中的狀態和SQL查詢狀態之間進行沖洗根據需要,什么也沒有永久持續,直到明確commit第一步。這種行為是,事實上,在Hibernate中完全相同的Java。然而,SQLAlchem??y的擁抱為Python相同的行為在風暴ORM的基礎上,使用這種風格的介紹SQLAlchem??y的是在0.3版本的時候。 0.5版帶來了更多的交易整合后交易到期推出后,每一個commit或rollback ,默認所有國家內的Session已過期(清除),來填充后續SQL語句時再重新選擇數據時,或當在剩余的過期的對象的屬性中訪問新事務的上下文中。最初,SQLAlchem??y的周圍建造假設SELECT語句應盡可能少排放,無條件的。過期的提交行為是緩慢的,在此原因,但是,它完全解決問題的Session載有過時的數據交易后,沒有簡單的方式來加載新的數據沒有重建的全套已加載的對象。在早期,它似乎這個問題不能合理解決,因為它是看不出來的時Session應考慮目前的狀態是過時的,從而昂貴的新集的SELECT語句在下次訪問。但是,一旦Session轉移到一個始終保持在一個交易模型,交易結束點變得明顯,自然點的數據過期,作為一個事務的性質具有高度隔離是, 它不能看到新的數據,直到它的承諾或回滾了。不同的數據庫和配置,當然有不同程度的事務隔離,包括沒有在所有的交易。這些模式的使用是完全可以接受的,SQLAlchem??y的到期使用較低的隔離模型,開發人員只需要知道,水平內如果有多個會話的會話可能會使未隔離的變化共享相同的行。這是不是在所有不同,什么都可以發生時直接使用兩個數據庫連接。 會議概述 圖20.13說明了Session的主要結構處理。 圖20.13:會議概述 面向公眾的部分上面是Session本身和用戶對象的集合,每一個映射的類的一個實例。在這里,我們看到映射的對象保持一個SQLAlchemy的建設的參考InstanceState ,跟蹤ORM一個單獨的實例包括待處理的屬性的變化和屬性的狀態過期狀態。InstanceState 在前面的討論是實例級側的屬性儀表節, 映射的剖析 ,一流水平的ClassManager相對應,并保持狀態的映射對象的字典(即Python的**dict**?代表的AttributeImpl相關聯的對象的類屬性) 。 狀態跟蹤 IdentityMap是數據庫身份InstanceState對象的映射,對于那些有一個數據庫的身份,這被稱為持久性的對象。的默認實現IdentityMap與InstanceState自我管理其大小所有強引用刪除用戶映射的情況下,一旦他們已被刪除的它的工作方式以同樣的方式作為Python的WeakValueDictionary 。、 保護組的所有對象標記為臟或刪除 ,以及有待對象的標新 ,收集垃圾,通過建立強大的對這些對象的引用掛起的更改。所有的強引用,然后被丟棄后沖水。 InstanceState也執行的關鍵任務,保持“有什么變化”對于一個特定的對象的屬性,使用此舉變化系統“先前”的一個特定的屬性值存儲在字典中稱為committed_state前傳入的值賦給對象的電流詞典。沖洗時間,內容committed_state 和與該對象相關聯的**dict**比較,以產生組凈變化對每個對象。 在集合的情況下,一個單獨的collections包坐標與InstrumentedAttribute / InstanceState 系統,以保持一個特定的映射集合的集合變動凈額del常見的Python類,如set , list和dict的子類在使用前和增強與歷史跟蹤mutator方法。收集系統在0.4?是開放式的,可用于任何集合類對象進行了修改。 事務控制 Session ,在默認狀態下的使用,維護打開事務的所有操作完成時commit或rollback被稱為。“SessionTransaction維護一組零個或多個Connection對象,每個對象代表一個開放的交易在一個特定的數據庫。SessionTransaction是一個懶惰的初始化的對象,開始沒有數據庫的狀態存在。作為一個特殊的后端需要參加在一份聲明中執行, Connection對應于該數據庫添加到SessionTransaction的名單連接安全要求.雖然在一個時間是一個單一的連接常見的,支持多種連接方案在特定的連接,用于一個特定的操作基于配置與Table , Mapper或SQL構建自己參與運作。多重連接也可以使用協調事務兩相的的行為,它提供那些DBAPIs。 20.9工作單位 提供flush Session將在其工作的flush方法一個獨立的模塊unitofwork 。正如前面提到的,沖洗過程可能是SQLAlchem??y的最復雜的功能。 工作單位的工作是將所有的掛起狀態,目前在一個特定的Session到數據庫中,掏空了new , dirty ,和deleted 收藏保持的Session 。完成后,內存中的狀態Session的,什么是在當前事務中的比賽。面臨的主要挑戰是確定正確的一系列的持久性的步驟,然后按正確的順序來執行它們。這包括確定INSERT,UPDATE和DELETE語句的列表,其中包括因從級聯的相關行被刪除或以其他方式移動,確保UPDATE報表只包含那些真正被修改的列,建立“同步”操作外鍵引用的主鍵列,將復制的狀態列,在該點在該新生成的主密鑰標識符可確保發生插入的對象添加到Session的順序盡可能有效,并確保UPDATE和DELETE語句出現在一個確定順序所以,以減少機會死鎖。 歷史 作為一個糾纏不清的系統結構,工作落實的單位開始寫在一個特設的方式,它的發展可以進行比較,發現沒有出路的森林地圖。早期的錯誤和缺少行為解決與螺栓連接修復,而一些重構,改善的事項通過0.5版本,它直到0.6版本,工作單位,時間穩定,很好理解,所涵蓋的上百個測試完全從頭開始重寫。經過幾個星期的考慮一個新的的方法,將驅動由一致的數據結構,過程重寫它使用這個新的模型只用了幾天,當時的想法是這個時候,充分的了解。它也是的事實,極大地促進了新實施??的行為可能是仔細對現有版本進行交叉檢查。此過程顯示如何在第一次迭代的東西,但是可怕的,仍然是有價值的,因為只要它提供了一個工作模型。這進一步顯示了總的一個子系統重寫往往是不僅是適當的,但一個不可分割的一部分的發展難以開發的系統。 拓撲排序 后面的工作單元的主要范式是組裝的完整列表,要采取的行動到一個數據結構中,每個節點代表一個單一的步驟;在設計模式中的說法,這被稱為命令模式 。的一系列在該結構中的“命令”,然后組織成一個特定的順序使用拓撲排序 。拓撲排序是一個過程,一個偏序 ,各種項目的基礎上,也就是說,只有某些元素必須先于其他人。圖20.14說明了拓撲排序的行為。 圖20.14:拓撲排序 工作單位構建了一個偏序,那些持久的命令,必須先別人的基礎上。“命令,然后拓撲排序,以便調用。確定哪些命令之前,主要來自存在的relationship ,填補了兩個Mapper對象一般, Mapper 被認為是依賴于其他,作為relationship意味著一個Mapper 有一個外鍵依賴于其他。類似的規則存在許多to-many關聯表,但在這里,我們專注于的情況下,one-to-many/many-to-one關系。外鍵的依賴性問題解決為了防止發生,沒有依賴于無需違反約束標記作為“遞延”的約束。但同樣重要的是,排序允許主鍵標識符,這在許多平臺上時,只產生一個INSERT其實時,被公正執行INSERT語句的結果填充到參數依賴的行是關于要插入列表。刪除,使用相同的順序在反向相關的行之前被刪除那些他們賴以生存,這些行所指的外鍵是不存在的,沒有演示文稿 工作單位提供系統拓撲排序在兩個不同的級別,進行依賴關系的結構的基礎上演示文稿第一個層次,持久性的步驟組織成桶的基礎上之間的依賴關系的映射器,即,完整的“桶”的對象對應某個特定的類。第二電平打破了零個或多個這些“桶”成較小的批次,處理的情況下,參考周期或自參照表。如圖20.15所示的“桶”產生的插入的一組User的對象,那么一組Address的對象,其中一個中間步驟,復制新生成的主鍵的值到User每個Address對象的user_id外鍵列。 圖20.15:組織對象的映射 在每個映射分揀情況,任何數目的User和Address對象可以被刷新沒有任何影響的復雜的步驟或多少“依賴關系”必須考慮的。 排序第二個層次的組織之間的直接依賴關系的基礎上的持久性步驟在一個單一的映射器的范圍之內的單個對象。當發生這種情況時,最簡單的例子是一個表,其中包含一個外鍵約束本身??需要一個特定的表中的行前插入另一行同一表中的,是指它的。另一是一系列的表格時有一個參考周期 :A引用了表B表,它引用表C,然后參考表A.在別人面前,一些A的對象必須插入允許的B和C的對象,也可以插入。表,該表是指本身是一種特殊的情況下,參考周期。 要確定哪些業務可以保持在其合并的,每個Mapper桶,將被分解成一個更大的集合的每個對象的命令,一個周期檢測算法被施加到映射器之間存在的依賴關系的設定,使用一個修改的版本的一個周期Guido van Rossum的博客上發現的檢測算法。這些桶在周期是然后再破碎成每個對象的操作和通過混入的集合的每個映射器水桶此外,每個對象桶的新的依賴規則每映射桶。如圖20.16所示桶中的User對象被分解成單個每個對象的命令,此外,從relationship User到一個新的contact relationship本身稱為contact造成的。 圖20.16:組織各個步驟的參考周期 鏟斗結構背后的基本原理是,它允許共同的批處理報表盡可能地,既減少所需的步數Python和實現更有效的互動與DBAPI,有時可以執行一個Python的報表內方法調用。只有當一個參考周期之間存在著映射器每個對象的依賴模式更昂貴的踢,即使如此,它只發生對象圖需要它的那些部分。 {0}·{/0}{1} {/1}{2}20 10{/2}總結 SQLAlchem??y的目的是非常高的的目標是自成立以來,最豐富的功能和靈活的數據庫產品。它已完成因此,雖然維持其專注于關系型數據庫,認識到在深入和全面的方式支持關系型數據庫的用處是一大創舉,即使是現在,范圍的承諾繼續顯露自己比以前認為的大。 的基于組件的方法的目的是提取每個區域的最可能值從的功能,提供了許多不同的單位,應用程序可以單獨使用或組合使用。該系統已具有挑戰性的創建,維護,和交付。 發展課程的目的是緩慢的基礎上,理論,堅實的功能是有條不紊的,基礎廣泛的建設,最終更有價值比快速傳遞功能,而無需基礎。它采取了很長一段時間的SQLAlchem??y興建。 一個一致的,記錄用戶的故事,但在整個過程中,底層構架始終領先一步,在某些情況下,“時間機器”的效果功能,可幾乎在添加用戶要求他們。 Python語言一直是一個可靠的主機(如果有點挑剔的,特別是在該地區的性能)。語言的SQLAlchem??y的一致性,極大地開放運行模式允許提供一個更好的比其他語言編寫的同類產品所提供的經驗。 這是希望的SQLAlchem??y的項目,Python的收益不斷更深的接納到盡可能廣泛的各種各樣的盡可能的領域和行業,使用關系型數據庫仍然充滿活力和進步的。這么做的目標是?SQLAlchem??y是表明,關系型數據庫,Python中,考慮的對象模型都是非常有價值的開發工具。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看