Introdução ao ORM com SQLAlchemy

Object-Relational Mapping (ORM) é uma técnica de programação que permite a conversão de dados entre sistemas incompatíveis usando objetos orientados a objetos. Com ORMs, você pode interagir com seu banco de dados de forma mais intuitiva e eficiente. Neste artigo, vamos explorar como usar SQLAlchemy, um dos ORMs mais populares para Python.

1. Introdução ao SQLAlchemy

SQLAlchemy é uma biblioteca poderosa para SQL e ORM em Python, que oferece uma maneira flexível e eficiente de trabalhar com bancos de dados relacionais.

Bibliotecas Necessárias

Certifique-se de ter as bibliotecas necessárias instaladas:

pip install sqlalchemy

2. Estrutura do Projeto

Organize seu projeto com a seguinte estrutura:

project/
│
├── app.py
└── requirements.txt

3. Configurando o SQLAlchemy

Código para configurar o SQLAlchemy

No arquivo app.py, adicione o seguinte código para configurar o SQLAlchemy:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# Configurando o banco de dados SQLite
DATABASE_URL = 'sqlite:///./test.db'

engine = create_engine(DATABASE_URL, echo=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

# Criando a tabela de usuários
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    email = Column(String, unique=True, index=True)

# Criando as tabelas no banco de dados
Base.metadata.create_all(bind=engine)

4. Inserindo Dados no Banco de Dados

Código para inserir dados

Adicione a função para inserir dados na tabela:

def create_user(db, name, email):
    db_user = User(name=name, email=email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

# Inserindo alguns usuários
if __name__ == '__main__':
    db = SessionLocal()
    user_1 = create_user(db, 'Alice', '[email protected]')
    user_2 = create_user(db, 'Bob', '[email protected]')
    print(user_1)
    print(user_2)
    db.close()

5. Consultando Dados no Banco de Dados

Código para consultar dados

Adicione a função para consultar dados da tabela:

def get_users(db):
    return db.query(User).all()

if __name__ == '__main__':
    db = SessionLocal()
    users = get_users(db)
    for user in users:
        print(user)
    db.close()

6. Atualizando Dados no Banco de Dados

Código para atualizar dados

Adicione a função para atualizar dados na tabela:

def update_user_email(db, user_id, new_email):
    user = db.query(User).filter(User.id == user_id).first()
    if user:
        user.email = new_email
        db.commit()
        db.refresh(user)
    return user

if __name__ == '__main__':
    db = SessionLocal()
    updated_user = update_user_email(db, 1, '[email protected]')
    print(updated_user)
    db.close()

7. Deletando Dados no Banco de Dados

Código para deletar dados

Adicione a função para deletar dados da tabela:

def delete_user(db, user_id):
    user = db.query(User).filter(User.id == user_id).first()
    if user:
        db.delete(user)
        db.commit()
    return user

if __name__ == '__main__':
    db = SessionLocal()
    deleted_user = delete_user(db, 2)
    print(deleted_user)
    db.close()

8. Testando o Código

Você pode testar cada função chamando-as diretamente no arquivo app.py ou criando um script separado para testar todas as funcionalidades.

Código completo de app.py

 

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = 'sqlite:///./test.db'

engine = create_engine(DATABASE_URL, echo=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    email = Column(String, unique=True, index=True)

Base.metadata.create_all(bind=engine)

def create_user(db, name, email):
    db_user = User(name=name, email=email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

def get_users(db):
    return db.query(User).all()

def update_user_email(db, user_id, new_email):
    user = db.query(User).filter(User.id == user_id).first()
    if user:
        user.email = new_email
        db.commit()
        db.refresh(user)
    return user

def delete_user(db, user_id):
    user = db.query(User).filter(User.id == user_id).first()
    if user:
        db.delete(user)
        db.commit()
    return user

if __name__ == '__main__':
    db = SessionLocal()
    
    user_1 = create_user(db, 'Alice', '[email protected]')
    user_2 = create_user(db, 'Bob', '[email protected]')
    print(f"Created: {user_1}, {user_2}")

    users = get_users(db)
    print("Users after insertion:")
    for user in users:
        print(user)
    
    updated_user = update_user_email(db, 1, '[email protected]')
    print(f"Updated: {updated_user}")

    users = get_users(db)
    print("Users after update:")
    for user in users:
        print(user)

    deleted_user = delete_user(db, 2)
    print(f"Deleted: {deleted_user}")

    users = get_users(db)
    print("Users after deletion:")
    for user in users:
        print(user)

    db.close()

9. Conclusão

Neste artigo, aprendemos como usar SQLAlchemy para interagir com um banco de dados SQL de forma eficiente e intuitiva. Passamos pela configuração do SQLAlchemy, criação de tabelas, inserção, consulta, atualização e deleção de dados.

Este guia fornece uma base sólida para começar a trabalhar com ORMs em Python. Continue explorando e adicionando funcionalidades mais complexas ao seu projeto conforme avança no aprendizado de desenvolvimento de software.

Rolar para cima