Migrações de banco de dados em Kotlin: Visão geral de ferramentas e abordagens

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Migrações de banco de dados em Kotlin: Guia completo sobre ferramentas e abordagens



Gerenciar alterações no esquema do banco de dados é uma das tarefas principais no desenvolvimento de qualquer aplicação. No ecossistema Kotlin, existem várias soluções maduras que permitem automatizar esse processo. Neste artigo, analisaremos três abordagens principais: recursos integrados da ORM Exposed, o clássico Flyway e o poderoso Liquibase. Você aprenderá como integrá-los em um projeto Kotlin e qual ferramenta escolher para tarefas específicas.



1. Por que as migrações são necessárias?

A execução manual de scripts SQL em diferentes ambientes (ambiente de desenvolvimento local, staging, produção) leva inevitavelmente à dessincronização do esquema. As migrações resolvem esse problema, fornecendo:

  • Versionamento de alterações no banco de dados
  • Aplicação automática de novos scripts na inicialização da aplicação
  • Possibilidade de reversão (rollback) para a versão anterior
  • Trabalho em equipe sem conflitos de esquema


2. Exposed: Suporte nativo a migrações

Exposed é uma ORM leve da JetBrains, escrita em Kotlin. A partir da versão 0.41.0, a biblioteca fornece seu próprio mecanismo de migrações, que se encaixa perfeitamente no ecossistema Kotlin.



Instalação

// build.gradle.ktsimplementation("org.jetbrains.exposed:exposed-core:0.55.0")implementation("org.jetbrains.exposed:exposed-dao:0.55.0")implementation("org.jetbrains.exposed:exposed-migrations:0.55.0")


Criação de migração

Cada migração é uma classe que herda de VoidDatabaseMigration:

import org.jetbrains.exposed.sql.transactions.transactionimport org.jetbrains.exposed.sql.SchemaUtilsimport org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.migrations.VoidDatabaseMigration

object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 255) override val primaryKey = PrimaryKey(id)}

class V1__CreateUsersTable : VoidDatabaseMigration() { override fun migrate() { transaction { SchemaUtils.create(Users) } }}

class V2__AddEmailColumn : VoidDatabaseMigration() { override fun migrate() { transaction { SchemaUtils.addColumn(Users, Users.varchar("email", 255)) } }}


Execução de migrações

import org.jetbrains.exposed.migrations.ExposedMigrationUtilsimport javax.sql.DataSource

fun runMigrations(dataSource: DataSource) { ExposedMigrationUtils.runMigrations( dataSource = dataSource, migrationsPackage = "com.example.migrations" )}


Vantagens: totalmente em estilo Kotlin, sem arquivos SQL, nomes de colunas tipados.
Desvantagens: vinculação ao Exposed, sem rastreador visual, ausência de rollback "nativo".



3. Flyway: Simplicidade e confiabilidade

Flyway é a ferramenta mais popular para migrações no mundo JVM. Funciona com qualquer banco de dados e não depende de ORM. Em Kotlin, é usado através do SDK oficial ou do plugin Gradle.



Conexão

// build.gradle.ktsimplementation("org.flywaydb:flyway-core:10.20.0")// Para PostgreSQL, adicione o driver:implementation("org.postgresql:postgresql:42.7.4")


Estrutura de migrações

O Flyway usa arquivos SQL com uma nomenclatura específica:

db/migration/   V1__create_users.sql   V2__add_email_column.sql   V3__add_role_column.sql


Exemplo de migração SQL (V1__create_users.sql)

CREATE TABLE users (    id SERIAL PRIMARY KEY,    name VARCHAR(255) NOT NULL,    email VARCHAR(255) UNIQUE);


Integração com Kotlin

import org.flywaydb.core.Flywayimport javax.sql.DataSou                    

Recommendations