Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Migrations for Java - Evoluindo seu banco de maneira incremental

Migrations for Java - Evoluindo seu banco de maneira incremental

Assim como as Migrations no mundo Ruby On Rails, o mundo Java também possui alternativas para evoluir o banco de dados de uma aplicação. Aprenda como você e sua equipe podem evoluir de maneira iterativa e incremental seu banco de dados – já em produção – durante a criação da sua aplicação.

Serão apresentados os problemas e desafios mais comuns de não utilizar uma ferramenta de migrations para gerenciar a evolução do banco de dados, e os benefícios que esta ferramenta traz em ambiente de desenvolvimento e produção.

Também serão apresentados opções de migrations para Java, suas principais diferenças e a experiência do palestrante ao adotar uma dessas ferramentas em projetos com bancos de dados criados do zero, e também projetos que precisam manter o legado.

- Palestra ministrada no QCONSP em 2013, no Javou da JavaCE em 2015 e em vários outros eventos locais;

(GRAVAÇÃO: https://youtu.be/BQICWePrLg0?list=PLHMMERsvy9EyWQPru4SrJAYHEGKfkjRgP)

Rafael Ponte

April 05, 2018
Tweet

More Decks by Rafael Ponte

Other Decks in Technology

Transcript

  1. <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="IssueTracker"> <properties>
 <!--

    ... --> <property name="hibernate.show_sql" value="true" />
 <property name="hibernate.format_sql" value="true" />
 <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence> persistence.xml
  2. INFO [SchemaUpdate ] Running hbm2ddl schema update INFO [SchemaUpdate ]

    fetching database metadata INFO [SchemaUpdate ] updating schema ... INFO [TableMetadata] table not found: issue INFO [SchemaUpdate ] create table issue (id bigserial not null, descricao varchar(255)) ... INFO [SchemaUpdate ] schema update complete
  3. @Entity class Issue { @Id
 private Long id; private String

    descricao;
 private String status = "A"; 
 … } Entidade ATUALIZADA!
  4. INFO [SchemaUpdate ] Running hbm2ddl schema update INFO [SchemaUpdate ]

    fetching database metadata INFO [SchemaUpdate ] updating schema ... INFO [TableMetadata] table found: issue INFO [TableMetadata] columns: [id, descricao] INFO [SchemaUpdate ] alter table issue add column status varchar(255) ...
 INFO [SchemaUpdate ] schema update complete
  5. @Entity class Issue { @Id
 private Long id;
 @Column(length=1000) private

    String descricao;
 private String status = "A"; 
 … } Entidade ATUALIZADA! <3
  6. INFO [SchemaUpdate ] Running hbm2ddl schema update INFO [SchemaUpdate ]

    fetching database metadata INFO [SchemaUpdate ] updating schema ... INFO [TableMetadata] table found: issue INFO [TableMetadata] columns: [id, status, descricao] INFO [TableMetadata] foreign keys: [] INFO [TableMetadata] indexes: [issue_pkey] ... ??????????? #WTF
 INFO [SchemaUpdate ] schema update complete
  7. WARNING: We've seen Hibernate users trying to use SchemaUpdate to

    update the schema of a production database automatically. This can quickly end in disaster and won't be allowed by your DBA. “ -- Java Persistence with Hibernate
  8. WARNING: We've seen Rafael Ponte trying to use SchemaUpdate to

    update the schema of a production database automatically. This can quickly end in disaster and won't be allowed by your DBA. “ -- Java Persistence with Hibernate
  9. CORRIGINDO O BANCO NA MÃO E o meu banco? Handerson

    Frota Mario Diniz Não tá entrando na tela...
  10. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) script.sql
  11. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) create_table_blog.sql
  12. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) 1_create_table_blog.sql
  13. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) <ID>_<DESCRIPTION>.sql
  14. APLICA O SCRIPT NO BANCO 2 [rponte] ~/myblog/scripts $ migrate

    up -env=PRODUCTION -env=HOMOLOG -env=DEV -env=TEST
  15. VERSIONA A MUDANÇA NO BANCO 3 mysql> select * from

    DB_VERSION; +----+---------------------+ | ID | DESCRIPTION | +----+---------------------+ | 1 | create table blog | +----+---------------------+
  16. APLICA SCRIPTS AINDA NÃO APLICADOS 4 [rponte] ~/myblog/scripts $ migrate

    up mysql> select * from DB_VERSION; +----+---------------------+ | ID | DESCRIPTION | +----+---------------------+ | 1 | create table blog | | 2 | create table author | | 3 | create table post | +----+---------------------+
  17. Flyway > Plain SQL migrations > Java migrations > Convention

    over Configuration > SQL Parser > Java API - Ant - Maven - Gradle
  18. Liquibase > XML migrations > Plain SQL migrations > Multiple

    Databases > Rollback support > Generation of SQL scripts for DBA
  19. MyBatis Schema Migrations > Plain SQL migrations > Generation of

    SQL scripts for DBA > Rollback support > Maven
  20. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 deploy frequente
  21. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 Q&A v44 Demo v45 deploy frequente deploy controlado
  22. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 Q&A v44 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  23. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 Q&A v44 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  24. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v44 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  25. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v49 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  26. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v49 Demo v49 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  27. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v49 Demo v49 Produção v49 deploy frequente deploy controlado deploy MUITO controlado
  28. APP BANC APPS que você NÃO conhece APPS que você

    conhece APPS que você conhece APPS que você NÃO conhece Data importers Data exporters Outros bancos Frameworks de persistência Código de teste APPS que você conhece APPS que você conhece APPS que você NÃO conhece Outros bancos Data importers Data exporters
  29. APP BANC APPS que você NÃO conhece APPS que você

    conhece APPS que você conhece APPS que você NÃO conhece Data importers Data exporters Outros bancos Frameworks de persistência Código de teste APPS que você conhece APPS que você conhece APPS que você NÃO conhece Outros bancos Data importers Data exporters “Deus no céu, e Banco de dados na terra.”
  30. Original Transição Resultado modifica o banco período de transição (antigo

    e novo) finaliza a modificação { { { Aplica as migrations, migra os dados, escreve código de compatibilidade
  31. Original Transição Resultado modifica o banco período de transição (antigo

    e novo) finaliza a modificação { { { Aplica as migrations, migra os dados, escreve código de compatibilidade Remove schema antigo e código de compatibilidade