Variables and variable substitution
Curiosus.Migrations supports basic variable substitution.
Variables in migrations provide several important benefits:
- Environment independence: Create migrations that work across different environments (development, staging, production) without code changes
- Improved maintainability: Centralize configuration values instead of hardcoding them throughout migrations
- Reduced errors: Avoid typos and inconsistencies by defining values once and reusing them
- Better security: Keep sensitive information out of migration scripts by injecting them as variables
How to use
To use variable substitution you should register variables when configuring migrator:
var variableValue = "my_variable";
var builder = new MigratorBuilder();
builder.UseVariable("%VARIABLIE%", variableValue);
Script migrations
In script migrations, preprocessing is performed to substitute variables with their values before execution.
-- %VARIABLIE% %NotExistedVariable%
SELECT * FROM dbo.%VARIABLIE%
After running migrator script will be transformed:
-- my_variable %NotExistedVariable%
SELECT * FROM dbo.my_variable
Code migrations
In code migrations, variables are accessible via the Variables property in your migration class. This property is a IReadOnlyDictionary<string, string> which is populated automatically when your migration is initialized.
public class MyCodeMigration : CodeMigration
{
public override MigrationVersion Version => new MigrationVersion(1, 0, 0);
public override string? Comment => "My migration with variables";
public override async Task UpgradeAsync(DbTransaction? transaction = null, CancellationToken cancellationToken = default)
{
// Access variables using the Variables dictionary
var user = Variables[DefaultVariables.User];
var dbName = Variables[DefaultVariables.DbName];
var customVariable = Variables["%VARIABLIE%"];
// Use variables in your migration logic
Logger?.LogInformation($"Running migration as user {user} on database {dbName}");
// Custom SQL with variables
var sql = $"CREATE TABLE {customVariable}_table (id INT)";
await MigrationConnection.ExecuteNonQueryAsync(sql, transaction, cancellationToken);
}
}
Default variables
All providers by default provide next variables:
%USER%- name of user from connection string%DBNAME%- database name