Este documento apresenta o framework Elixir, que é um mapeador objeto-relacional para Python baseado no SQLAlchemy. Elixir permite criar objetos em Python e mapeá-los automaticamente para tabelas em bancos de dados relacionais, removendo a necessidade de escrever código SQL diretamente. O documento também discute extensões existentes para Elixir, como criptografia e validação de campos, e como criar novas extensões personalizadas.
Leandro Lameiro - Extensões para o Elixir - Apresentação na PyConBrasil 2008
1. Extensões para o Elixir
Leandro Lameiro
lameiro@gmail.com
PyConBrasil 2008
2. Programa
SQLAlchemy
Elixir
Extensões legais existentes
Como fazer suas próprias extensões
3. SQLAlchemy?
SQLAlchemy é um toolkit SQL e um mapeador
objeto-relacional.
Toolkit SQL - Permite escrever SQL em Python
(sem depender de peculiaridades de bancos)
4. Mapeamento objeto o que?!
Mapeamento objeto-relacional: Uma maneira
de levar objetos para bancos relacionais.
A maioria das aplicações hoje são escritos em
linguagem OO.
OO e relacional são sistemas de tipos
diferentes. Levar o mundo OO para o mundo
relacional não é sempre fácil.
Por exemplo, é difícil exprimir em modelo
relacional o polimorfismo.
Ou exprimir em OO o constraint unique.
5. Ahh, SQLAlchemy
Permite definir como os seus objetos vão parar
no banco.
Você tem controle total, inclusive de continuar
usando o SQL.
Algo parecido com o Hibernate, mas sem os
XMLs.
Suporte a vários bancos, multiplos bancos
simulatâneos, etc.
6. Elixir?
ActiveRecord para Python, sobre o
SQLAlchemy.
É um pattern descrito no Patterns of Enterprise
Application Architecture – Martin Fowler
É uma maneira simples de persistir os dados
sem precisar pensar muito, sem saber SQL.
Uma tabela por classe, uma linha por instância.
(mais ou menos...)
Dá métodos de busca, inserção etc.
7. Chega de blá-blá-blá: Quero ver código!
Criar objeto: aluno = Aluno()
Ler atributos: aluno.nome
Escrever atributos: aluno.nome = 'Foobar'
Elixir/SQLAlchemy cuidam de montar o SQL
correto (no caso INSERT, SELECT e UPDATE,
respectivamente).
8. Elixir
class Aluno(Entity):
nome = Field(Text)
telefone = Field(Text)
idade = Field(Integer)
materias = ManyToMany('Materia')
class Materia(Entity):
nome = Field(Text)
alunos = ManyToMany('Aluno')
10. Elixir
In [1]: print mariazinha.materias
[<Materia nome='Matemática'>]
Depois de inserir (append) na lista, o Elixir trata
de inserir no banco de dados, ligar as chaves
primárias/estrangeiras etc.
Nem uma linhazinha de SQL. Nada de chave
primária, chave estrangeira, tabela
intermediária. Nada.
11. Extensões legais
Encriptação
Campos automaticamente encriptados
Wiki
Colunas com controle de versão e suporte a
consulta de versões antigas, reversão etc.
Validação
Validação de formato, limites, etc.
E é muito fácil fazer outras!