SQLAlchemy ORM - 宣告對映



SQLAlchemy 的物件關係對映 (ORM) API 的主要目標是方便將使用者定義的 Python 類與資料庫表關聯起來,並將這些類的物件與相應表中的行關聯起來。物件的狀態變化和行的變化會同步匹配。SQLAlchemy 允許用使用者定義的類及其定義的關係來表達資料庫查詢。

ORM 建立在 SQL 表示式語言之上。它是一種高階且抽象的用法模式。事實上,ORM 是表示式語言的一種應用用法。

雖然可以使用物件關係對映 (ORM) 獨家構建成功的應用程式,但有時使用 ORM 構建的應用程式可能需要直接使用表示式語言來處理特定的資料庫互動。

宣告對映

首先,呼叫 `create_engine()` 函式來設定一個引擎物件,該物件隨後用於執行 SQL 操作。該函式有兩個引數,一個是資料庫的名稱,另一個是 `echo` 引數,當設定為 `True` 時將生成活動日誌。如果資料庫不存在,則會建立它。在下面的示例中,建立了一個 SQLite 資料庫。

from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)

當呼叫 `Engine.execute()` 或 `Engine.connect()` 等方法時,引擎會建立與資料庫的實際 DBAPI 連線。然後它用於發出 SQL,ORM 並不直接使用引擎;而是由 ORM 在幕後使用。

在 ORM 的情況下,配置過程從描述資料庫表開始,然後定義將對映到這些表的類。在 SQLAlchemy 中,這兩個任務一起執行。這是透過使用宣告式系統完成的;建立的類包含描述它們對映到的實際資料庫表的指令。

在宣告式系統中,一個基類儲存類的目錄和對映的表。這被稱為宣告式基類。在一個常用的匯入模組中,通常只有一個基類的例項。`declarative_base()` 函式用於建立基類。此函式定義在 `sqlalchemy.ext.declarative` 模組中。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

一旦聲明瞭基類,就可以根據它定義任意數量的對映類。下面的程式碼定義了一個客戶類。它包含要對映到的表,以及表中列的名稱和資料型別。

class Customers(Base):
   __tablename__ = 'customers'
   
   id = Column(Integer, primary_key = True)
   name = Column(String)
   address = Column(String)
   email = Column(String)

宣告式類必須具有 `__tablename__` 屬性,並且至少有一個屬於主鍵的 `Column`。宣告式系統用特殊的 Python 訪問器(稱為描述符)替換所有 `Column` 物件。此過程稱為 instrumentation(工具化),它提供了一種在 SQL 上下文中引用表的方法,並支援從資料庫持久化和載入列的值。

像普通的 Python 類一樣,這個對映類根據需要具有屬性和方法。

關於宣告式系統中類的資訊稱為表元資料。SQLAlchemy 使用 `Table` 物件來表示宣告式系統為特定表建立的此資訊。`Table` 物件是根據規範建立的,並透過構造 `Mapper` 物件與類關聯。這個對映器物件不會直接使用,而是作為對映類和表之間的內部介面使用。

每個 `Table` 物件都是更大的集合(稱為 `MetaData`)的成員,並且可以透過宣告式基類的 `.metadata` 屬性獲得此物件。`MetaData.create_all()` 方法接收引擎作為資料庫連線的來源。對於所有尚未建立的表,它都會向資料庫發出 CREATE TABLE 語句。

Base.metadata.create_all(engine)

建立資料庫和表以及對映 Python 類的完整指令碼如下所示:

from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Customers(Base):
   __tablename__ = 'customers'
   id = Column(Integer, primary_key=True)

   name = Column(String)
   address = Column(String)
   email = Column(String)
Base.metadata.create_all(engine)

執行後,Python 控制檯將回顯以下正在執行的 SQL 表示式:

CREATE TABLE customers (
   id INTEGER NOT NULL,
   name VARCHAR,
   address VARCHAR,
   email VARCHAR,
   PRIMARY KEY (id)
)

如果我們使用 SQLiteStudio 圖形工具開啟 Sales.db,它將顯示其中帶有上述結構的 customers 表。

Customers Table
廣告
© . All rights reserved.