Neste post vamos criar o modelo da Base de dados para o nosso blog.

Para lidar com a persistência de dados no nosso blog, vamos usar a framework SQLAlchemy.

O SQLAlchemy é um ORM (Object Relational Mapper). Os ORMs permitem trabalhar com as base de dados usando objectos em vez de tabelas e SQL. As operações realizadas sobre os objectos serão traduzidos em SQL e transmitidos para a base de dados pelo ORM.


Para o motor da nossa base de dados vamos usar o sqlite. Escolhi o sqlite por conveniência, visto que ele já vem instalado com o Python e assim não precisamos instalar e configurar mais software.

Base de dados


Instalar o SQLAlchemy

Com o ambiente virtual do blog activo, usar o pip para instalar o SQLAlchemy:
pip install sqlalchemy


Criar o modelo da Base de Dados

Criar o package models (não esquecer de adicionar o ficheiro __init__.py) e dentro do package criar o ficheiro db.py.

- models/db.py:
import os
import datetime

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship


"""
Ficheiro com o modelo da base de dados.  
"""

Base = declarative_base()

#Pasta onde está localizada a base de dados
basedir = os.path.abspath(os.path.dirname(__file__))

#Ligação à base de dados sqlite
engine = create_engine('sqlite:///' + os.path.join(basedir, 'app.db'))

class Users(Base):
    #tabela users (utilizadores)
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    #role -> nivel de acesso do utilizador, 0 por omissao
    role = Column(Integer, default=0)
    email = Column(String(255), nullable=False, index = True, unique = True)
    site = Column(String(255), nullable=True)
    password = Column(String(500), nullable=False)
    last_login = Column(DateTime())
    last_logout = Column(DateTime())
    created = Column(DateTime, default=datetime.datetime.utcnow())    
    posts = relationship('Posts', backref = 'author', lazy = 'dynamic')
    comments = relationship('Comments', backref = 'author', lazy = 'dynamic')
    
    
    def __repr__(self):
        """
        Representação de um utilizador.
        Utilizado quando se faz print do objecto.
        """
        return '<User {}>'.format(self.email)


class Posts(Base):    
    #tabela posts
    __tablename__ = 'posts'
    
    id = Column(Integer, primary_key = True)
    url = Column(String(255), nullable=False, index = True, unique = True)
    title = Column(String(255))
    content = Column(String(5000))
    last_edited = Column(DateTime,
                         default=datetime.datetime.utcnow(),
                         onupdate=datetime.datetime.utcnow())
    created = Column(DateTime, default=datetime.datetime.utcnow())
    user_id = Column(Integer, ForeignKey('users.id'))
    comments = relationship('Comments', backref = 'post', lazy = 'dynamic')
    
    
    def __repr__(self):
        """
        Representação de um post.
        Utilizado quando se faz print do objecto.
        """
        return '<Post {}>'.format(self.url)


class Comments(Base):
    #tabela comments (comentários)
    __tablename__ = 'comments'
    
    id = Column(Integer, primary_key = True)
    content = Column(String(2000))
    last_edited = Column(DateTime,
                         default=datetime.datetime.utcnow(),
                         onupdate=datetime.datetime.utcnow())
    created = Column(DateTime, default=datetime.datetime.utcnow())    
    user_id = Column(Integer, ForeignKey('users.id'))
    post_id = Column(Integer, ForeignKey('posts.id'))
    
    
    def __repr__(self):
        """
        Representação de um comentário.
        Utilizado quando se faz print do objecto."""
        return '<Comment {}>'.format(self.content)


#Inicia a base de dados
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()


No próximo post veremos como usar a base de dados para adicionar utilizadores ao nosso blog.


Este post faz parte da série de posts "Tutorial, Blog em Python":
  1. Tutorial, Blog em Python - Parte 1: Introdução
  2. Tutorial, Blog em Python - Parte 2: Ambiente de Desenvolvimento
  3. Tutorial, Blog em Python - Parte 3: Estrutura do projecto
  4. Tutorial, Blog em Python - Parte 4: Templates
  5. Tutorial, Blog em Python - Parte 5: Base de Dados (post actual)
  6. Tutorial, Blog em Python - Parte 6: Source code