Categories
Python

Apresentando: simple-db-migrate

Desde o fim do ano passado tenho me divertido um bocado desenvolvendo em Python e Django.

Apesar de ter alguns detalhes esquisitos (especialmente na implementação de OO), Python é uma linguagem sensacional e muito produtiva! O Django também é ótimo e não deixa nada a desejar para o Rails, porém, as comparações são inevitáveis. Uma das coisas que mais senti falta desenvolvendo com Python/Django foram as migrations do Rails. Na verdade, pra quem está acostumado as migrations também fazem falta em Java, PHP e basicamente em qualquer projeto que os bancos de dados são constantemente modificados e complicados demais para serem gerenciados manualmente, independente da linguagem.

Foi por isso que decidi começar o projeto simple-db-migrate. Inicialmente o objetivo era criar algo parecido com as migrations do Rails para o Django, mas agora o objetivo é (além disso) criar migrations para o que quer que seja.

Para isso ser possível as migrations usam DDL ao invés de uma DSL em Python:

Arquivo: 20090215224601_criar_tabela_pessoas.migration

SQL_UP = """
create table pessoas (
    id int(11) not null auto_increment,
    ... etc. ...
);
"""
SQL_DOWN = """
drop table pessoas;
"""

Na verdade, como as migrations são nada mais do que duas Strings Python (SQL_UP e SQL_DOWN), é possível executar qualquer código Python nas migrations que gerem SQL. No futuro isso irá me ajudar a implementar alguma coisa que use os models do Django para criar a DDL automaticamente.

O fato das migrations serem em DDL faz com que eu possa escrever migrations para qualquer tipo de projeto, independente da linguagem e mesmo que no futuro as migrations também possam ser feitas usando uma DSL Python.

Para ver o simple-db-migrate funcionando, depois de instalá-lo (instruções no site), basta ir para o diretório onde estão as migrations e executar:

db-migrate

Se você não quer ter o trabalho de escrever as suas migrations, no diretório “example” tem uma porção delas prontas. Além das migrations é necessário criar um arquivo “simple-db-migrate.conf” com as configurações do banco de dados:

HOST = "localhost"
USERNAME = "root"
PASSWORD = ""
DATABASE = "migration_example"

O arquivo pode ter outros nomes e não necessariamente você precisa estar no diretório das migrations, basta passar essas configurações para o db-migrate pela linha de comando:

db-migrate --dir=migrations_dir --config=path/to/file.conf

Ou output é algo assim:

$ db-migrate --dir=example --config=example/sdbm.conf
 
Starting DB migration...
- Current version is: 20090211120000
- Destination version is: 20090212120000
 
Starting migration up!
 
===== executing 20090211120001_add_user_age.migration (up) =====
===== executing 20090211120002_add_user_mother_age.migration (up) =====
===== executing 20090211120003_create_table_chimps.migration (up) =====
===== executing 20090212120000_create_table_aleatory.migration (up) =====
 
Done.

E por último, já que eu ainda não tenho muita documentação disponível ainda, para ver todas as opções possíveis da linha de comando basta digitar:

db-migrate --help

O simple-db-migrate ainda está em fase embrionária (na verdade comecei na semana passada), mas já está entrando em uso essa semana em dois projetos na Globo.com, ou seja, possivelmente ele vai evoluir bem rápido. Apesar de ainda ser bem simples, tudo que eu mostrei aqui já funciona.

Agora há pouco criei uma versão inicial da página do projeto no Github pages com algumas instruções para instalação e uso (bem simples mesmo, ainda pretendo melhorar bastante). O código fonte está disponível no meu Github e os tickets podem ser acompanhados no Lighthouse.

10 replies on “Apresentando: simple-db-migrate”

Guilherme, realmente tá fazendo falta isso no Django. Mas eu fiquei curioso para saber o que você pensou do South, do Dmigrations, e do django-evolution, que durante a DjangoCon 1.0 foram apresentados como principais candidatos a fornecer a solução “canônica” para este problema. Na época eu descartei o dmigrations porque só funcionava com MySQL, e o django-evolution me pareceu demasiadamente mágico, então eu preferi o South, mas agora estou achando que ele não está evoluindo num bom ritmo. A idéia de fazer uma ferramenta de migrações que seja independente do framework e possa ser usada em projetos Java etc. é ótima.

@Luciano

Pra ser muito sincero eu não olhei ele a fundo não, e nem os outros. Olhei alguns para Java e conheço bem o de Rails.

Quando percebí que talvez fosse possível ter migrations “multiplataforma”, eu me concentrei em fazer logo uma versão inicial para provar o conceito sem olhar os outros muito a fundo. 🙂 Tudo isso aconteceu da última 5a. feira para hoje, o problema foi falta de tempo mesmo.

Daí veio a idéia de que dava pra unir isso com o Django também, porque as migrations são código Python e eu poderia usar os models do Django pra gerar a DDL automaticamente (sem fazer com que deixe de ser multi-plataforma – a DDL manual continua funcionando).

Nessa semana vou me concentrar em olhar melhor, usar e testar os outros projetos (esses aqui: http://code.djangoproject.com/wiki/SchemaEvolution) para saber qual será o rumo do meu projeto. Pode ser que ele nem faça sentido ou pode ser que valha a pena me juntar com um desses projetos que já existem.

Enfim, por enquanto estou só brincando e provando o conceito 🙂

[ ]s, gc

Eu já fiz o mesmo para .net. Só não tive tempo (ou incentivo) para continuar pois o db-migrate jah fazia o que eu precisava.

Apesar disso é um assunto que me interesso muito.

A idéia de ser DDL pura é ótima pelo simples fato de eu achar horrível usar DDL pura… 🙂

Hehehe, esses argumentos de duplo sentido são ótimos né? Vou explicar. Se o framework usa ddl pura, eu posso criar uma DSL que gere a minha forma de escrever DDL (como o Guilherme ilustrou e como funcionam as inúmeras gems de rails q modificam as migrations).

Excelente trabalho GC 🙂 Vou baixar o código depois e ver como contribuir.

Abraços,
Bernardo Heynemann

Muito legal Guilherme, tb estou iniciando em Python / Django e gosto da flexibilidade. O migrations é uma coisa que realmente faz falta no Django, vou testar seu projeto.

Abraços

Bravo! Great idea! I will be looking to use your code in an installer I am writing and let you know how it goes.

Thanks,
Kelly

Leave a Reply

Your email address will not be published. Required fields are marked *