SQLAlchemy ORM - Dichiarazione di mappatura

L'obiettivo principale dell'API Object Relational Mapper di SQLAlchemy è facilitare l'associazione di classi Python definite dall'utente con tabelle di database e oggetti di tali classi con righe nelle tabelle corrispondenti. Le modifiche negli stati degli oggetti e delle righe vengono sincronizzate tra loro. SQLAlchemy consente di esprimere query di database in termini di classi definite dall'utente e le loro relazioni definite.

L'ORM è costruito sopra il linguaggio di espressione SQL. È un modello di utilizzo di alto livello e astratto. In effetti, ORM è un utilizzo applicato del linguaggio delle espressioni.

Sebbene un'applicazione di successo possa essere costruita utilizzando esclusivamente Object Relational Mapper, a volte un'applicazione costruita con ORM può utilizzare Expression Language direttamente dove sono richieste interazioni di database specifiche.

Dichiara mappatura

Prima di tutto, viene chiamata la funzione create_engine () per impostare un oggetto motore che viene successivamente utilizzato per eseguire operazioni SQL. La funzione ha due argomenti, uno è il nome del database e l'altro è un parametro echo quando è impostato su True genererà il registro delle attività. Se non esiste, verrà creato il database. Nell'esempio seguente, viene creato un database SQLite.

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

Il motore stabilisce una connessione DBAPI reale al database quando viene chiamato un metodo come Engine.execute () o Engine.connect (). Viene quindi utilizzato per emettere SQLORM che non utilizza direttamente l'Engine; invece, è usato dietro le quinte dall'ORM.

In caso di ORM, il processo di configurazione inizia descrivendo le tabelle del database e quindi definendo le classi che verranno mappate su quelle tabelle. In SQLAlchemy, queste due attività vengono eseguite insieme. Questo viene fatto utilizzando il sistema dichiarativo; le classi create includono direttive per descrivere la tabella di database effettiva a cui sono mappate.

Una classe base memorizza un catlog di classi e tabelle mappate nel sistema dichiarativo. Questa è chiamata come classe base dichiarativa. Di solito ci sarà solo un'istanza di questa base in un modulo importato comunemente. La funzione dichiarative_base () viene utilizzata per creare la classe base. Questa funzione è definita nel modulo sqlalchemy.ext.declarative.

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

Una volta dichiarata la classe di base, è possibile definire un numero qualsiasi di classi mappate in termini di essa. Il codice seguente definisce la classe di un cliente. Contiene la tabella su cui eseguire il mapping e i nomi e i tipi di dati delle colonne.

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

Una classe in Dichiarativo deve avere un'estensione __tablename__ attributo e almeno uno Columnche fa parte di una chiave primaria. Dichiarativo sostituisce tutti i fileColumn oggetti con speciali funzioni di accesso Python note come descriptors. Questo processo è noto come strumentazione che fornisce i mezzi per fare riferimento alla tabella in un contesto SQL e consente la persistenza e il caricamento dei valori delle colonne dal database.

Questa classe mappata come una normale classe Python ha attributi e metodi secondo il requisito.

Le informazioni sulla classe nel sistema dichiarativo sono chiamate metadati di tabella. SQLAlchemy utilizza l'oggetto Table per rappresentare queste informazioni per una tabella specifica creata da Dichiarative. L'oggetto Table viene creato secondo le specifiche ed è associato alla classe costruendo un oggetto Mapper. Questo oggetto mappatore non viene utilizzato direttamente ma viene utilizzato internamente come interfaccia tra la classe mappata e la tabella.

Ogni oggetto Table è un membro di una raccolta più ampia nota come MetaData e questo oggetto è disponibile utilizzando l'estensione .metadataattributo della classe base dichiarativa. IlMetaData.create_all()metodo è passare nel nostro motore come fonte di connettività del database. Per tutte le tabelle che non sono state ancora create, invia le istruzioni CREATE TABLE al database.

Base.metadata.create_all(engine)

Lo script completo per creare un database e una tabella e per mappare la classe Python è fornito di seguito:

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)

Quando viene eseguita, la console Python echeggerà dopo l'esecuzione dell'espressione SQL:

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

Se apriamo Sales.db utilizzando lo strumento grafico SQLiteStudio, mostra al suo interno la tabella dei clienti con la struttura sopra menzionata.