Em 06/11/07, Túlio Paiva<paiva...@gmail.com> escreveu:
> Olá!
>
> Preciso adicionar atributos a uma classe num sistema que já está
> funcionando. Em outras ocasiões eu adicionei os novos atributos na classe de
> modelo e os inseri manualmente no terminal do postgres, de modo que a classe
> de modelo combine com o banco de dados. Existe forma mais fácil de se fazer
> isso?
>
O Django ainda não possui nenhuma ferramenta para evolução e migração
de um banco de dados.
No momento há 3 ferramentas para migração envolvendo python e django:
DBMigration - migração de dados do Django - http://www.aswmc.com/dbmigration/
Yadsel - Projeto criado pelo Marinho, para migração e evolução de uma
base de dados, suporta vários banco de dados -
http://code.google.com/p/yadsel/
Deseb - um projeto feito externamente pelo pessoal do Django que eu
creio que futuramente se "juntará" ao framework -
http://code.google.com/p/deseb/
[] 's
--
Andrews Medina
http://pyman.blogspot.com/
www.andrewsmedina.com.br
http://www.djangoproject.com/documentation/django-admin/#inspectdb
[]s
On 6 nov, 15:45, "Andrews Medina" <andrewsmed...@gmail.com> wrote:
> Olá,
>
> Em 06/11/07, Túlio Paiva<paivatu...@gmail.com> escreveu:
>
> > Olá!
>
> > Preciso adicionar atributos a uma classe num sistema que já está
> > funcionando. Em outras ocasiões eu adicionei os novos atributos na classe de
> > modelo e os inseri manualmente no terminal do postgres, de modo que a classe
> > de modelo combine com o banco de dados. Existe forma mais fácil de se fazer
> > isso?
>
> O Django ainda não possui nenhuma ferramenta para evolução e migração
> de um banco de dados.
>
> No momento há 3 ferramentas para migração envolvendo python e django:
>
> DBMigration - migração de dados do Django -http://www.aswmc.com/dbmigration/
>
> Yadsel - Projeto criado pelo Marinho, para migração e evolução de uma
> base de dados, suporta vários banco de dados -http://code.google.com/p/yadsel/
pelo que entendi, ele não quer trabalhar com uma base de dados
existente. E sim usar o syncdb para criar novos campos em uma tabela
relacionados a novos atributos criados no model.
[]'s
Andrews,
então se eu quiser colocar mais um campo na tabela dentro do models e
utilizando o syncdb, eu preciso instalar o DBMigration??
./manage.py dumpdata aplicacao --format=xml > aplicacao.xml
./manage.py reset aplicacao (tem que confirmar esse comando com yes)
./manage.py syncdb
./manage.py loaddata aplicacao.xml
Tem funcionado, porém minhas aplicações ainda são minúsculas, quero
ver a hora que eu tiver milhares de registros se isso vai continuar
viável mas pra uma aplicação em desenvolvimento deve servir muito bem,
pois provavelmente os dados inseridos são passíveis de serem perdidos,
você apenas não quer cadastrar tudo novamente, correto?
>
> Andrews,
> então se eu quiser colocar mais um campo na tabela dentro do models e
> utilizando o syncdb, eu preciso instalar o DBMigration??
>
As coisas não são tão simples assim! O scyndb cria as tabelas a partir
do model. Dai para usar os migrations ( seja um dos 3 que eu citei ),
você teraá que criar um arquivo ( em python ou sql ) com as
modificações, e isso é feito em cada versão feita.
Ps: Hoje andei novamente testando os 3, ainda não terminei os testes,
mas o que mais me agradou foi o yadsel feito pelo Marinho.
Me avise se eu estiver errado, mas se tu tiver alterado um model o
dumpdata vai dar erro.
>
> Tem funcionado, porém minhas aplicações ainda são minúsculas, quero
> ver a hora que eu tiver milhares de registros se isso vai continuar
> viável mas pra uma aplicação em desenvolvimento deve servir muito bem,
> pois provavelmente os dados inseridos são passíveis de serem perdidos,
> você apenas não quer cadastrar tudo novamente, correto?
>
Para resolver isso que estão criando uma ferramenta para evolução de dados.
www.fundacaoaprender.org.br
(35)3471-4181
o Yadsel está em utilização por dois sistemas da Tron, implantados em
dezenas de clientes, alguns deles com quase 1 milhão de registros em
algumas tabelas. Ele está longe de estar completo, mas está bastante
estável no que diz respeito ao Firebird.
quanto aos outros drivers, o SQLite e o MySQL estão atrás, mas nos
testes que fiz à epoca parecia estáveis... mas realmente é
incomparável um software testado em campo com outro apenas
ligeiramente testado em hipoteses.
mas quanto a isso, pode ficar tranquilo, pois a API está bastante
simples e fácil de ser extendida e melhorada... criar um driver é
bastante simples. Se você for utiliza-lo, prometo que invisto bastante
tempo em deixar pronto o driver do SGBD que for utilizar, ou vc mesmo
pode fazer se preferir.
Em 10/11/07, Gustavo Gonçalves<gus...@fundacaoaprender.org.br> escreveu:
--
Marinho Brandão (José Mário)
Desenvolvimento
Tron Informática Ltda
Telefone: 55 (62) 3239 7337
Eu amo a coesão do Django, mas acredito que neste caso em particular,
a forma como eu adotei no Yadsel é mais interessante porque ele
possibilita que eu utilize o mesmo script, com os mesmos padrões, em
qualquer ferramenta. Isso me dá um ganho que eu espero de uma
ferramenta de evolução de banco: a migração. O fato de permitir
drivers evita problemas do tipo "escrevi o modelo num padrão e vou
escrever a evolução em outro". O fato de ser baseado nos padrões do
SQL, e não no ORM, também ajuda nesse sentido.
É exatamente por isso que optei por adotar essa tática no Yadsel, ao
invés de caminhar para a idéia padrão de criar mais um contrib ou algo
similar do framework. Para se ter ideia, a utilização do Yadsel aqui é
feita em sintonia com um sistema em Delphi+Windows+Firebird, o que é
muito diferente da minha realidade em casa (Python+Ubuntu+SQLite).
Isso não me impede de ser entusiasta da ferramenta de evolução de
esquema que está sendo feita no Django, mas por opção eu prefiro o
modelo do Yadsel.
:)
Em 12/11/07, rasga<rafael....@decapole.com.br> escreveu:
www.fundacaoaprender.org.br
(35)3471-4181
Em 12/11/07, Gustavo Gonçalves<gus...@fundacaoaprender.org.br> escreveu:
Cara, dei uma estudada no Yadsel...
Pelo que entendi, além de modificar o modelo no Django, também teria
que ir a classe de versão do banco de dados no Yadsel e fazer as
alterações.
Entendo seu intuito ao criar o sistema, mas estou procurando algo mais
direto. O ideal para mim seria algo tipo "manage.py dbevolve" ou algo
do tipo. Algo assim não seria legal?
Não seria possível criar uma camada para conectar os modelos com o
Yadsem sem necessidade de criação de uma classe intermediária? Não
achei que valesse a pena estudar a complexidade da criação de classes
de versão para minha necessidade que é só incluir mais alguns campos,
alterar ou remover outros... Pode ser que esteja enganado, porque não
sei se existe algo tão simples como estou procurando.
Mas estive dando uma olhada, parabéns pelo trabalho, é uma ferramenta
e tanto! Talvez em minha busca ainda volte à ela.
Abraço!
Em 14/11/07, Marinho Brandao<mar...@gmail.com> escreveu:
--
Gustavo H. de A. Gonçalves
Fundação Aprender
Centro de Estudos, Pesquisa e Tecnologia
www.fundacaoaprender.org.br
(35)3471-4181
Já olhou os outros da lista em
http://code.djangoproject.com/wiki/SchemaEvolution?
Até,
semente
--
Guilherme Mesquita Gondim (semente)
Fui ver o "deseb" agora:
http://code.google.com/p/deseb/
Parece que funciona como quero:
>> manage.py dbevolve
Quase acertei o nome da opção! rs
Parece que funciona bem e para minha necessidade atende.
Alguém da lista usa?
Em 13/12/07, Gustavo Gonçalves<gus...@fundacaoaprender.org.br> escreveu:
> Fala Marinho!
>
> Cara, dei uma estudada no Yadsel...
>
> Pelo que entendi, além de modificar o modelo no Django, também teria
> que ir a classe de versão do banco de dados no Yadsel e fazer as
> alterações.
>
> Entendo seu intuito ao criar o sistema, mas estou procurando algo mais
> direto. O ideal para mim seria algo tipo "manage.py dbevolve" ou algo
> do tipo. Algo assim não seria legal?
>
> Não seria possível criar uma camada para conectar os modelos com o
> Yadsem sem necessidade de criação de uma classe intermediária? Não
> achei que valesse a pena estudar a complexidade da criação de classes
> de versão para minha necessidade que é só incluir mais alguns campos,
> alterar ou remover outros... Pode ser que esteja enganado, porque não
> sei se existe algo tão simples como estou procurando.
>
> Mas estive dando uma olhada, parabéns pelo trabalho, é uma ferramenta
> e tanto! Talvez em minha busca ainda volte à ela.
>
> Abraço!
--
1 - DbMigrations
Para evoluir o banco, precisa ser criado um script SQL intermediário,
ou um script Python. Para cada sistema de banco de dados deve ser
criado um arquivo diferente. Específico para Django.
2 - Yadsel
Para evoluir o banco, precisa ser criado uma classe em python usando
para isso outras classes do mesmo projeto para definir as mudanças
feitas. É via de duas mãos, esta classe tanto evolui quanto retorna à
versão anterior. Desta maneira existe uma abstração de qual sistema de
banco de dados está sendo usado, podendo-se criar drivers para outros
sistemas caso não já suportados pelo Yadsel. Uma ferramenta bem mais
ampla, desatrelada do Django, que pode ser útil em qualquer sistema
que use banco de dados.
3 - Deseb
100% integrado ao Django. Rode "manage.py dbevolve" que irá te mostrar
as mudanças que quer fazer, baseado nas alterações que foram feitas
nos modelos, pedindo aprovação. Específico para Django e muito
simples. É baixar e começar a usar. Ainda faltando alguns tipos de
operações, mas já faz o mais essêncial.
Me corrijam se estiver enganado.
Abraços!
cara, vc está certo. Da forma como está hoje é realmente mais complexo
do que os "concorrentes". Na verdade o projeto prevê a criação de um
driver para Django, que fará exatamente o que você quer, mas ainda
está em projeto, não foi feito ainda :)
vez ou outra eu melhoro alguma coisinha por lá. Anteontem criei a
opção de logging, ontem criei um campo para registrar o tipo de
finalização daquela versão no historico (ok ou erro), na semana
passada eu fiz o 'silent'... mas todos esses são recursos que levaram
menos de 1 hora pra fazer, o driver do Django com certeza levará mais
tempo que isso :)
dê uma olhada nesses outros, há alguns que prometem bem, se quiser
também implementar o driver pra Django, seja bem-vindo! :)
Em 13/12/07, Gustavo Gonçalves<gus...@fundacaoaprender.org.br> escreveu:
>
Já olhou o http://code.google.com/p/django-evolution/ ? Eu não usei
nenhum ainda, mas esse me parece o mais transparente. Só não sei se
funciona direito...
Apareceram mais 3 para verificar...
http://code.google.com/p/django-evolution/
http://code.google.com/p/schema-evolution/
http://code.google.com/p/django-schemaevolution/
Bem, já olhei o deseb, ja botei em uso, só vou olhar os outros por
agora... Se alguém puder dar uma olhada e mandar um parecer acho q
todos agradecem.
Abraços
2007/12/13, Guilherme M. Gondim (semente) <sem...@gmail.com>:
--
1 - django-evolution
Chamado com o comando "manage.py evolve". Se colocar a opção --hint
mostra o que será feito. Roda as alterações se colocar a opção
--execute. Tem a possibilidade de armazenar em arquivos as alterações,
usando código muito parecido ao usado nos modelos. Possível de
realizar alterações usando SQL armazenado em um arquivo externo.
Mostra uma mensagem "need evolution" quando é executado o syncdb,
indicando que o banco e o modelo estão diferentes.
2 - schema-evolution
Sei lá, achei a página do wiki muito confusa e me parece que o pessoal
do projeto ainda não decidiu ao certo como o sistema deve funcionar.
Não entendi muito bem...
3 - django-schemaevolution
Um projeto pouco documentado, parece também que funciona criando
scripts para modificar o banco. Só funciona com MySQL não dei muito
crédito.
Bem, pelo que vi, o deseb e o django-evolutions são os melhores sendo
que o deseb é mais simples e o django-evolutions te dá mais opções.
Abraços
Em 13/12/07, Gustavo Gonçalves<gus...@fundacaoaprender.org.br> escreveu:
A diferença, creio, é que com o deseb você deixa explícito as
modificações, por isso a simplicidade no código. Já no
django-evolution ele faz uma análise geral. Estou certo ou errado?
E você disse o django-evolution pode gerar um arquivo com a
modificação, certo? Seria instruções em SQL para alterar a tabela no
banco? Isso é bom para fazer patchs. Talvez usarei no django-diario[1]
se for isso mesmo.
Valeu,
semente
1. http://django-diario.googlecode.com
O evolution quando vc dá "manage.py evolve --hint" ele te mostra um
código python que contém as modificações que serão feitas. Você pode
pegar este código em python, copiar e colar para um arquivo em seu
projeto. Daí fica com a modificação do banco armazenada, podendo rodar
ela quando quiser. Quase da mesma maneira, você coloca um arquivo sql
dentro da pasta específica em seu projeto que ele roda também, quando
você chamar "manage.py --execute --sql"
O Deseb também adivinha o que tem que ser alterado, não precisa
especificar um script. Mas a diferença do Evolution é que não tem esta
opção de criar script python ou sql.
Achei o Evolution mais maduro estou usando ele. Mas o Deseb é bem
legal também pra quem só precisa usar na versão de desenvolvimento, é
só dar "manage.py dbevolve" e responder sim ou não às alterações que
vão aparecer.
Abraço
Em 13/12/07, Guilherme M. Gondim (semente)<sem...@gmail.com> escreveu:
Voltando ao assunto:
O deseb não faz evolução e sim apenas a migração, já com o
django-evolution a migração também é possível. Pelo andar das
carruagens creio que o django-evolution será incorporado nas proximas
versoes do django. (acho que isso foi ate aprovado ja no
django-developers)
[]'s
Eu testei o deseb faz a evolução sim, fiz até uns testes. A não ser
que eu estaja confundindo os termos. Segue o texto do google code:
Django, via the command ./manage syncdb, can automatically build a
database schema based on your applications models.py file. However,
after you've done this once, it leaves you with two unpleasant
follow-up options if you ever make any changes to your model
structure:
1. destroy your existing schema (along with all your data) and let
./manage syncdb rebuild it for you
2. manage your own schema upgrades by writing your own SQL
Project deseb aims to fill this void by providing s third option:
1. generate schema upgrades via the command: ./manage evolvedb
Seria muito legal ver esta comparação no django brasil.
Abraço
Em 13/12/07, Andrews Medina<andrew...@gmail.com> escreveu:
Para mim evolução é quando uma base evolui e você tem o registro de
evolução podendo voltar a uma versão anterior quando quiser. O deseb
não faz isso. Ele apenas é um syncdb que ajusta alteracoes nas
tabelas. Já o django-evolution pelo que vi registra as evoluções em
classes em python automaticamente e faz as mudanças físicas no banco
também.
Podia mesmo. Alguém se dispõe para criar o artigo?
Até,
semente
Em 13/12/07, Andrews Medina<andrew...@gmail.com> escreveu:
>
Estamos aqui para isso!
Gustavo, já que fez todo esse levantamento poderia se candidatar a
escreve um artigo sobre migração e evolução de dados no Django. O que
acha?