SQLAlchemy ORM - deklarowanie mapowania

Głównym celem Object Relational Mapper API SQLAlchemy jest ułatwienie kojarzenia zdefiniowanych przez użytkownika klas języka Python z tabelami bazy danych oraz obiektów tych klas z wierszami w odpowiadających im tabelach. Zmiany stanów obiektów i wierszy są do siebie dopasowywane synchronicznie. SQLAlchemy umożliwia wyrażanie zapytań do bazy danych w zakresie klas zdefiniowanych przez użytkownika i ich zdefiniowanych relacji.

ORM jest zbudowany w oparciu o język wyrażeń SQL. Jest to wysokopoziomowy i abstrakcyjny wzór użytkowania. W rzeczywistości ORM jest stosowanym użyciem języka wyrażeń.

Chociaż pomyślna aplikacja może zostać skonstruowana wyłącznie przy użyciu Object Relational Mapper, czasami aplikacja zbudowana za pomocą ORM może używać języka wyrażeń bezpośrednio, gdy wymagane są określone interakcje z bazą danych.

Zadeklaruj mapowanie

Przede wszystkim wywoływana jest funkcja create_engine () w celu skonfigurowania obiektu silnika, który jest następnie używany do wykonywania operacji SQL. Funkcja ma dwa argumenty, jeden to nazwa bazy danych, a drugi to parametr echo, gdy ustawiono wartość True, wygeneruje dziennik aktywności. Jeśli nie istnieje, baza danych zostanie utworzona. W poniższym przykładzie tworzona jest baza danych SQLite.

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

Silnik ustanawia rzeczywiste połączenie DBAPI z bazą danych, gdy wywoływana jest metoda, taka jak Engine.execute () lub Engine.connect (). Następnie jest używany do emitowania kodu SQLORM, który nie korzysta bezpośrednio z silnika; zamiast tego jest używany za kulisami przez ORM.

W przypadku ORM proces konfiguracyjny rozpoczyna się od opisu tabel bazy danych, a następnie definiowania klas, które zostaną odwzorowane na te tabele. W SQLAlchemy te dwa zadania są wykonywane razem. Odbywa się to za pomocą systemu deklaratywnego; utworzone klasy zawierają dyrektywy opisujące rzeczywistą tabelę bazy danych, na którą są odwzorowane.

Klasa bazowa przechowuje katalog klas i mapowanych tabel w systemie deklaratywnym. Nazywa się to deklaratywną klasą bazową. Zwykle będzie tylko jedno wystąpienie tej bazy w powszechnie importowanym module. Funkcja declarative_base () służy do tworzenia klasy bazowej. Ta funkcja jest zdefiniowana w module sqlalchemy.ext.declarative.

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

Po zadeklarowaniu klasy bazowej można zdefiniować w jej ramach dowolną liczbę mapowanych klas. Poniższy kod definiuje klasę klienta. Zawiera tabelę, na którą ma zostać zmapowana, oraz nazwy i typy danych kolumn w niej.

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

Klasa w Declarative musi mieć rozszerzenie __tablename__ atrybut i co najmniej jeden Columnktóry jest częścią klucza podstawowego. Deklaratywne zastępuje wszystkieColumn obiekty ze specjalnymi akcesoriami Pythona znanymi jako descriptors. Ten proces jest znany jako instrumentacja, która zapewnia środki odwoływania się do tabeli w kontekście SQL i umożliwia utrwalanie i ładowanie wartości kolumn z bazy danych.

Ta odwzorowana klasa, podobnie jak normalna klasa Pythona, ma atrybuty i metody zgodnie z wymaganiami.

Informacje o klasie w systemie deklaratywnym nazywane są metadanymi tabeli. SQLAlchemy używa obiektu Table do reprezentowania tych informacji dla określonej tabeli utworzonej przez Declarative. Obiekt Table jest tworzony zgodnie ze specyfikacjami i jest powiązany z klasą poprzez utworzenie obiektu Mapper. Ten obiekt mapowania nie jest używany bezpośrednio, ale jest używany wewnętrznie jako interfejs między mapowaną klasą a tabelą.

Każdy obiekt Table jest członkiem większej kolekcji znanej jako MetaData i ten obiekt jest dostępny przy użyciu rozszerzenia .metadataatrybut deklaratywnej klasy bazowej. PlikMetaData.create_all()metoda polega na przekazaniu do naszego silnika jako źródła połączenia z bazą danych. Dla wszystkich tabel, które nie zostały jeszcze utworzone, wysyła instrukcje CREATE TABLE do bazy danych.

Base.metadata.create_all(engine)

Pełny skrypt do tworzenia bazy danych i tabeli oraz mapowania klasy Pythona jest podany poniżej -

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)

Po uruchomieniu konsola Pythona wyświetli echo po wykonywaniu wyrażenia SQL -

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

Jeśli otworzymy Sales.db za pomocą narzędzia graficznego SQLiteStudio, wyświetli się w nim tabela klientów o powyższej strukturze.