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