No meu curso de Ciência da Computação(que estou cursando 3o ano), tenho uma matéria de Banco de Dados, no caso o banco usado pelo Professor em sala é o PostgreSQL. No começo do ano começamos a usar o DBDesigner, e no caso ele é uma versão para o MySQL. Nada impede de usar ele com o Postgre, mas tem um pequeno detalhe. O DBDesigner não entende o tipo SERIAL(que é usado para auto-incremento), no caso é criado um novo tipo de dado, chamado SERIAL(claro), aí vem o problema, ao exportar pelo DBDesigner ele faz o campo que é usada como chave estrangeira também ser SERIAL, mais o correto seria ele ser INTEGER, para resolver esse problema é necessário alterar o XML referente nas linhas onde tem o idDatatype para o tipo de dado referente ao SERIAL.
Como eu uso linux no meu notebook fica fácil, nada que o sed não resolva, mas antes vamos achar qual o código referente ao tipo de dado do SERIAL:
$ grep SERIAL exemplo.xml
<DATATYPE ID="44" IDGroup="4" TypeName="SERIAL" Description="User defined Datatype." ParamCount="0" OptionCount="0" ParamRequired="0" EditParamsAsString="0" SynonymGroup="0" PhysicalMapping="0" PhysicalTypeName="" >
No meu caso o código referente ao tipo de dado SERIAL é o 44, como mostra o resultado acima.
Agora que já sabemos o código, basta usar o sed para alterar:
$ sed -ri.velho 's/^(.*idDatatype=\")44(\".*IsForeignKey="1\".*)/\15\2/' exemplo.xml
Ele não vai mostrar nada, somente vai alterar o arquivo e salvar o antigo com extensão .velho, sendo assim vai ter 2 arquivos: o exemplo.xml e o exemplo.xml.velho, contendo o arquivo alterado e o antigo respectivamente.
Explicando o comando:
sed - o comando usado para a "mágica", a sintaxe dele é sed <opcoes> <comando> <arquivo>
opções = -ri.velho = -r para usar expressões regulares, -i para alterar o arquivo, o .velho para renomear esse e salvar outro com mesmo nome
comando = opc/origem/destino/
opc -> s - diz ao sed para usar a função de substituir
origem - como ta no texto
destino - como deve ficar
^ - começo de linha
.* - guloso, pega tudo o que tiver na linha, ou até encontrar algo referente ao que tiver na frente
\" - é a aspas mesmo, mais como ela é um "carácter especial" tenho que proteger para mostrar no comando.
() - o "abre e fecha parenteses" diz ao sed que o que tiver dentro dele será um conjunto, no caso tenho 2 conjuntos, podem ser utilizados até 9 conjuntos.
\numero - são os espelhos dos conjuntos criados. no caso utilizei o \1 e o \2, não confunda o \15, na verdade é \1 e o numero 5. nesse caso o \1 estaria me trazendo o primeiro e o \2 o segundo conjunto, lembrando que pode ser utilizados até 9 conjuntos.
Simplificando: ele vai pesquisar por linhas que comecem com qualquer coisa, e nela tenha o idDatatype=”44″ mais alguma coisa(.*), o IsForeignKey=”1″ e o final dessa mesma linha e alterar o 44(SERIAL) por 5(INTEGER). Seria isso, não ficou bem explicado? Comenta a sua dúvida que eu respondo 😀
Agora é só exportar o arquivo que vai estar certo, com o SERIAL nas chaves primárias e INTEGER nas chaves estrangeiras.
Exemplo Utilizado: exemplo.xml
2 comentários
Para Windows, pode fazer um tutorial? Obrigado!
Autor
Cara, para Windows é só baixa, e instala.. Mesma coisa que no LInux 😀