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.

Tags: , , , , , , , , , , ,

10 Responses to “Apresentando: simple-db-migrate”

  1. Legal seu projeto cara. Trabalho diariamente com Rails e amo python como linguagem. Em casa faço meus projetos em Django e senti muita falta das migrations também.

    Aí achei o projeto South (http://south.aeracode.org/), não sei se conhece, usei num projeto de teste e achei interessante. Bem útil.

    abraços,

  2. Muito boa a iniciativa!

    Tenho uma pergunta: como a app faz para descobrir em qual versão está o banco de dados? Ele cria uma tabela de “metadados” quem contém essa informação?

    Abraços.

  3. 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.

  4. @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

  5. 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

  6. Parabéns!

    Tem gente que fica reclamando, tá faltando isso, deveria ter aquilo. Você teve a iniciativa de trazer uma das features mais interessantes do Rails pro Django.

    :D Parabéns!!!!

  7. Samir says:

    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

  8. Muito legal Guilherme, bom ver voce postando coisas mais tecnicas de novo, welcome back mate!!

  9. Kelly says:

    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