SQLAlchemy ORM - Deklarieren von Mapping

Das Hauptziel der Object Relational Mapper-API von SQLAlchemy besteht darin, die Zuordnung von benutzerdefinierten Python-Klassen zu Datenbanktabellen und von Objekten dieser Klassen zu Zeilen in den entsprechenden Tabellen zu erleichtern. Zustandsänderungen von Objekten und Zeilen werden synchron miteinander abgeglichen. Mit SQLAlchemy können Datenbankabfragen in Form von benutzerdefinierten Klassen und ihren definierten Beziehungen ausgedrückt werden.

Das ORM basiert auf der SQL Expression Language. Es ist ein hochrangiges und abstrahiertes Nutzungsmuster. Tatsächlich ist ORM eine angewandte Verwendung der Ausdruckssprache.

Obwohl eine erfolgreiche Anwendung ausschließlich mit dem Object Relational Mapper erstellt werden kann, verwendet eine mit dem ORM erstellte Anwendung manchmal die Ausdruckssprache direkt, wenn bestimmte Datenbankinteraktionen erforderlich sind.

Mapping deklarieren

Zunächst wird die Funktion create_engine () aufgerufen, um ein Engine-Objekt einzurichten, das anschließend zum Ausführen von SQL-Operationen verwendet wird. Die Funktion hat zwei Argumente, eines ist der Name der Datenbank und das andere ist ein Echo-Parameter, wenn auf True gesetzt, wird das Aktivitätsprotokoll generiert. Wenn es nicht existiert, wird die Datenbank erstellt. Im folgenden Beispiel wird eine SQLite-Datenbank erstellt.

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

Die Engine stellt eine echte DBAPI-Verbindung zur Datenbank her, wenn eine Methode wie Engine.execute () oder Engine.connect () aufgerufen wird. Es wird dann verwendet, um das SQLORM auszugeben, das die Engine nicht direkt verwendet. Stattdessen wird es vom ORM hinter den Kulissen verwendet.

Im Fall von ORM beginnt der Konfigurationsprozess mit der Beschreibung der Datenbanktabellen und der Definition von Klassen, die diesen Tabellen zugeordnet werden. In SQLAlchemy werden diese beiden Aufgaben zusammen ausgeführt. Dies erfolgt mithilfe des deklarativen Systems. Die erstellten Klassen enthalten Anweisungen zur Beschreibung der tatsächlichen Datenbanktabelle, der sie zugeordnet sind.

Eine Basisklasse speichert ein Catlog von Klassen und zugeordneten Tabellen im deklarativen System. Dies wird als deklarative Basisklasse bezeichnet. In einem häufig importierten Modul befindet sich normalerweise nur eine Instanz dieser Basis. Die Funktion declative_base () wird zum Erstellen der Basisklasse verwendet. Diese Funktion ist im Modul sqlalchemy.ext.declarative definiert.

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

Sobald die Basisklasse deklariert ist, kann eine beliebige Anzahl von zugeordneten Klassen definiert werden. Der folgende Code definiert die Klasse eines Kunden. Es enthält die Tabelle, der zugeordnet werden soll, sowie Namen und Datentypen der darin enthaltenen Spalten.

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

Eine deklarative Klasse muss a haben __tablename__ Attribut und mindestens eines ColumnDas ist Teil eines Primärschlüssels. Deklarativ ersetzt alleColumn Objekte mit speziellen Python-Accessoren, bekannt als descriptors. Dieser Prozess wird als Instrumentierung bezeichnet, die die Möglichkeit bietet, in einem SQL-Kontext auf die Tabelle zu verweisen, und das Fortbestehen und Laden der Werte von Spalten aus der Datenbank ermöglicht.

Diese zugeordnete Klasse verfügt wie eine normale Python-Klasse über Attribute und Methoden gemäß den Anforderungen.

Die Informationen zur Klasse im deklarativen System werden als Tabellenmetadaten bezeichnet. SQLAlchemy verwendet das Table-Objekt, um diese Informationen für eine bestimmte von Declarative erstellte Tabelle darzustellen. Das Tabellenobjekt wird gemäß den Spezifikationen erstellt und der Klasse durch Erstellen eines Mapper-Objekts zugeordnet. Dieses Mapper-Objekt wird nicht direkt verwendet, sondern intern als Schnittstelle zwischen zugeordneter Klasse und Tabelle verwendet.

Jedes Table-Objekt ist Mitglied einer größeren Sammlung, die als MetaData bezeichnet wird, und dieses Objekt ist über das verfügbar .metadataAttribut der deklarativen Basisklasse. DasMetaData.create_all()Methode ist, unsere Engine als Quelle für Datenbankkonnektivität zu übergeben. Für alle Tabellen, die noch nicht erstellt wurden, werden CREATE TABLE-Anweisungen an die Datenbank ausgegeben.

Base.metadata.create_all(engine)

Das vollständige Skript zum Erstellen einer Datenbank und einer Tabelle sowie zum Zuordnen der Python-Klasse finden Sie unten:

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)

Bei der Ausführung wird die Python-Konsole nach dem Ausführen des SQL-Ausdrucks wiedergegeben.

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

Wenn wir die Sales.db mit dem SQLiteStudio-Grafiktool öffnen, wird die darin enthaltene Kundentabelle mit der oben genannten Struktur angezeigt.