Migrations de bases de données en Kotlin : outils et exemples pratiques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Migrations de bases de données en Kotlin : comment gérer le schéma sans douleur

\n

Lors du développement en Kotlin, surtout en combinaison avec la JVM, tôt ou tard se pose le problème de la synchronisation de la structure de la base de données entre les développeurs, les serveurs de test et de production. L'exécution manuelle de scripts SQL entraîne une désynchronisation et des erreurs. La solution — les migrations de bases de données. C'est une méthode automatisée pour versionner les modifications du schéma : création de tables, ajout de colonnes, d'index et de déclencheurs.

\n

Dans cet article, nous analyserons trois outils populaires pour Kotlin : Flyway, Liquibase et le mécanisme intégré Exposed. Vous apprendrez comment les intégrer dans un projet, écrire des migrations et éviter les problèmes typiques.

\n\n

Flyway : simplicité et versionnement

\n

Flyway est l'outil de migration le plus populaire dans l'écosystème JVM. Il prend en charge Kotlin, Java et Groovy. Principe de fonctionnement : vous écrivez des scripts SQL (ou des classes Java/Kotlin), et Flyway suit ceux qui ont déjà été appliqués à l'aide de la table flyway_schema_history.

\n

Connexion dans Gradle (Kotlin DSL) :

\n
dependencies {\n    implementation("org.flywaydb:flyway-core:9.22.3")\n    // pour PostgreSQL\n    implementation("org.flywaydb:flyway-database-postgresql:9.22.3")\n}
\n

Exemple de migration V1__create_users.sql :

\n
CREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    username VARCHAR(50) NOT NULL UNIQUE,\n    email VARCHAR(100) NOT NULL,\n    created_at TIMESTAMP DEFAULT NOW()\n);\n\nCREATE INDEX idx_users_email ON users(email);
\n

Lancement depuis le code Kotlin :

\n
import org.flywaydb.core.Flyway\n\nfun main() {\n    val flyway = Flyway.configure()\n        .dataSource("jdbc:postgresql://localhost:5432/mydb", "user", "pass")\n        .load()\n    flyway.migrate()\n}
\n

Avantages :

\n
    \n
  • Configuration minimale
  • \n
  • Prise en charge des rollbacks (undo) dans la version payante
  • \n
  • Fonctionne avec n'importe quel SQL
  • \n
\n

Inconvénients :

\n
    \n
  • Pas de validation intégrée du schéma
  • \n
  • Gestion difficile des branches
  • \n
\n\n

Liquibase : flexibilité et déclarativité

\n

Liquibase propose deux approches : les modifications peuvent être décrites en XML, YAML, JSON ou directement en SQL. Pour les projets Kotlin, le format YAML est pratique — il est lisible et facile à versionner.

\n

Ajout dans Gradle :

\n
dependencies {\n    implementation("org.liquibase:liquibase-core:4.24.0")\n}
\n

Exemple de fichier changelog db.changelog-master.yaml :

\n
databaseChangeLog:\n  - changeSet:\n      id: 1\n      author: developer\n      changes:\n        - createTable:\n            tableName: users\n            columns:\n              - column:\n                  name: id\n                  type: BIGINT\n                  autoIncrement: true\n                  constraints:\n                    primaryKey: true\n              - column:\n                  name: username\n                  type: VARCHAR(50)\n                  constraints:\n                    nullable: false\n                    unique: true\n              - column:\n                  name: email\n                  type: VARCHAR(100)\n        - createIndex:\n            indexName: idx_users_email\n            tableName: users\n            columns:\n              - column:\n                  name: email
\n

Lancement depuis Kotlin :

\n
import liquibase.Liquibase\nimport liquibase.database.jvm.JdbcConnection\nimport liquibase.resource.ClassLoaderResourceAccessor\nimport java.sql.DriverManager\n\nfun runMigrations() {\n    val connection = DriverManager.getConnection(\n        "jdbc:postgresql://localhost:5432/mydb", "user", "pass"\n    )\n    val database = DatabaseFactory.getInstance()\n        .findCorrectDatabaseImplementation(JdbcConnection(connection))\n    val liquibase = Liquibase("db.changelog-mas                    

Recommendations