createMigration method
Future<MigrationVersionArtifacts?>
createMigration({
- String? tag,
- required bool force,
- required GeneratorConfig config,
- bool write = true,
Implementation
Future<MigrationVersionArtifacts?> createMigration({
String? tag,
required bool force,
required GeneratorConfig config,
bool write = true,
}) async {
var versions = await _artifactStore.listVersions();
var latestVersion = versions.lastOrNull;
var databaseDefinitionLatest = await _getSourceDatabaseDefinition(
projectName,
latestVersion,
);
var models = await ModelHelper.loadProjectYamlModelsFromDisk(
config,
);
var modelDefinitions = StatefulAnalyzer(config, models, (uri, collector) {
collector.printErrors();
if (collector.hasSevereErrors) {
throw GenerateMigrationDatabaseDefinitionException();
}
}).validateAll();
var databaseDefinitionProject = createDatabaseDefinitionFromModels(
modelDefinitions,
config.name,
config.modulesAll,
dialect: config.databaseDialect,
);
var databaseDefinitions = await _loadModuleDatabaseDefinitions(
config.modulesDependent,
directory,
);
var versionName = createVersionName(tag);
var nextMigrationVersion = DatabaseMigrationVersionModel(
module: projectName,
version: versionName,
);
var databaseDefinitionNext = _mergeDatabaseDefinitions(
databaseDefinitionProject,
databaseDefinitions,
nextMigrationVersion,
);
var migration = generateDatabaseMigration(
databaseSource: databaseDefinitionLatest,
databaseTarget: databaseDefinitionNext,
);
var warnings = migration.warnings;
_printWarnings(warnings);
if (warnings.isNotEmpty && !force) {
log.info('Migration aborted. Use --force to ignore warnings.');
throw const MigrationAbortedException();
}
if (migration.isEmpty) {
log.info(
'No changes detected.',
);
return null;
}
var sqlGenerator = SqlGenerator.forDialect(config.databaseDialect);
var artifacts = MigrationVersionArtifacts(
version: versionName,
definitionSql: sqlGenerator.generateDatabaseDefinitionSql(
databaseDefinitionNext,
installedModules: databaseDefinitionNext.installedModules,
),
migrationSql: sqlGenerator.generateDatabaseMigrationSql(
migration,
databaseDefinitionNext,
installedModules: databaseDefinitionNext.installedModules,
removedModules: _removedModulesDiff(
databaseDefinitionLatest.installedModules,
databaseDefinitionNext.installedModules,
),
),
definition: databaseDefinitionNext,
projectDefinition: databaseDefinitionProject,
migration: migration,
);
if (write) {
await _artifactStore.writeVersion(artifacts);
versions.add(versionName);
await _artifactStore.writeVersionRegistry(versions);
}
return artifacts;
}