Schema Migrations

Automatic schema evolution with version tracking and embedded migrations.

Overview

SchemaLang automatically generates migration files when struct versions change, embedding migration SQL directly in generated code.

Struct Versioning

Add versions using semantic versioning:

struct User: version(1.2.0) {
    int64: id: primary_key: required: auto_increment: 
        description("User ID");
    string: username: required: 
        description("Username");
}

Version format: major.minor.patch

Automatic Migration Generation

Enable with -migrationsPath:

./SchemaLangTranspiler \
    -schema=./schemas \
    -outputDirectory=./output \
    -migrationsPath=./migrations \
    -cpp -sqlite

SchemaLang automatically creates migration files when versions change.

Embedded Migrations

Migrations are embedded in generated code as functions:

std::string SQLiteDB::migrate_User_1_0_0_to_1_1_0() {
    return R"SQL(
        ALTER TABLE User ADD COLUMN email VARCHAR(255);
        UPDATE User SET email = '';
    )SQL";
}

Auto-applied on database connect—no runtime migration files needed!

Migration Workflow

  1. Update schema and increment version
  2. Run transpiler with -migrationsPath
  3. Migration files generated automatically
  4. Recompile application
  5. Migrations apply automatically on next database connection