SQLAlchemy ORM - Declarando Mapeamento

O principal objetivo da API Object Relational Mapper de SQLAlchemy é facilitar a associação de classes Python definidas pelo usuário com tabelas de banco de dados, e objetos dessas classes com linhas em suas tabelas correspondentes. As mudanças nos estados de objetos e linhas são sincronizadas entre si. SQLAlchemy permite expressar consultas de banco de dados em termos de classes definidas pelo usuário e seus relacionamentos definidos.

O ORM é construído com base na linguagem de expressão SQL. É um padrão de uso de alto nível e abstrato. Na verdade, ORM é um uso aplicado da linguagem de expressão.

Embora um aplicativo bem-sucedido possa ser construído usando exclusivamente o Mapeador Relacional de Objetos, às vezes um aplicativo construído com o ORM pode usar a linguagem de expressão diretamente onde são necessárias interações específicas do banco de dados.

Declare Mapping

Em primeiro lugar, a função create_engine () é chamada para configurar um objeto de mecanismo que é subsequentemente usado para executar operações SQL. A função tem dois argumentos, um é o nome do banco de dados e outro é um parâmetro de eco quando definido como True irá gerar o log de atividades. Se não existir, o banco de dados será criado. No exemplo a seguir, um banco de dados SQLite é criado.

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

O mecanismo estabelece uma conexão DBAPI real com o banco de dados quando um método como Engine.execute () ou Engine.connect () é chamado. Ele é então usado para emitir o SQLORM que não usa o Engine diretamente; em vez disso, ele é usado nos bastidores pelo ORM.

No caso do ORM, o processo de configuração começa descrevendo as tabelas do banco de dados e, em seguida, definindo as classes que serão mapeadas para essas tabelas. No SQLAlchemy, essas duas tarefas são executadas juntas. Isso é feito usando o sistema declarativo; as classes criadas incluem diretivas para descrever a tabela de banco de dados real para a qual são mapeadas.

Uma classe base armazena um catálogo de classes e tabelas mapeadas no sistema declarativo. Isso é chamado de classe base declarativa. Normalmente haverá apenas uma instância desta base em um módulo comumente importado. A função declarative_base () é usada para criar a classe base. Esta função é definida no módulo sqlalchemy.ext.declarative.

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

Depois que a classe base é declarada, qualquer número de classes mapeadas pode ser definido em termos dela. O código a seguir define a classe de um cliente. Ele contém a tabela a ser mapeada e os nomes e tipos de dados das colunas.

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

Uma classe em Declarativo deve ter um __tablename__ atributo, e pelo menos um Columnque faz parte de uma chave primária. Declarativo substitui todos osColumn objetos com acessores Python especiais conhecidos como descriptors. Este processo é conhecido como instrumentação, que fornece os meios para se referir à tabela em um contexto SQL e permite persistir e carregar os valores das colunas do banco de dados.

Esta classe mapeada, como uma classe Python normal, possui atributos e métodos de acordo com o requisito.

As informações sobre a classe no sistema Declarativo, são chamadas de metadados da tabela. SQLAlchemy usa o objeto Table para representar esta informação para uma tabela específica criada por Declarative. O objeto Tabela é criado de acordo com as especificações e é associado à classe pela construção de um objeto Mapeador. Este objeto mapeador não é usado diretamente, mas é usado internamente como interface entre a classe mapeada e a tabela.

Cada objeto Table é um membro de uma coleção maior conhecida como MetaData e este objeto está disponível usando o .metadataatributo da classe base declarativa. oMetaData.create_all()método é, passando em nosso motor como uma fonte de conectividade de banco de dados. Para todas as tabelas que ainda não foram criadas, ele emite instruções CREATE TABLE para o banco de dados.

Base.metadata.create_all(engine)

O script completo para criar um banco de dados e uma tabela, e para mapear a classe Python é fornecido abaixo -

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 executado, o console Python irá ecoar a seguinte expressão SQL sendo executada -

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

Se abrirmos o Sales.db usando a ferramenta gráfica SQLiteStudio, ele mostra a tabela de clientes dentro dele com a estrutura mencionada acima.