Skip to main content

Schema

Schema features are separated from query execution:

  • Query execution lives on DriverAdapter
  • Schema operations / introspection live on SchemaDriver
  • Schema dump/load is optional via SchemaStateProvider

SchemaDriver​

Drivers that support migrations and schema operations implement SchemaDriver. It supports:

  • applying schema plans (applySchemaPlan)
  • previewing schema plans (describeSchemaPlan)
  • introspecting live metadata (tables, columns, indexes, foreign keys)

Ormed’s migration runner builds schema plans from migrations (a list of mutations), and then asks the active driver to apply them.

SchemaInspector​

SchemaInspector is a small helper around SchemaDriver for common checks:

Future<bool> hasUsersTable(DataSource dataSource) async {
final driver = dataSource.connection.driver;
if (driver is! SchemaDriver) return false;
final inspector = SchemaInspector(driver);
return inspector.hasTable('users');
}

Schema plan previews​

For schema work, the plan type is SchemaPlan (a list of SchemaMutation entries). Drivers can preview a plan without running it:

SchemaPreview previewSchemaPlan(DataSource dataSource) {
final driver = dataSource.connection.driver;
if (driver is! SchemaDriver) {
throw StateError('Driver does not support schema operations.');
}
final plan = SchemaPlan(
mutations: [
SchemaMutation.rawSql(
'CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY)',
),
],
description: 'demo plan preview',
);
return driver.describeSchemaPlan(plan);
}

Use previews when you want to:

  • show “what would run” without applying changes
  • log/inspect generated DDL in tests
  • build migration tooling that explains a plan

Schema dumps (SchemaStateProvider)​

Some features (like schema dumps used for migration squashing) rely on an optional interface:

  • SchemaStateProvider.createSchemaState(...) returns a SchemaState?
  • SchemaState can dump(...) and load(...) when supported
Future<void> dumpSchemaIfSupported(DataSource dataSource) async {
final driver = dataSource.connection.driver;
if (driver is! SchemaStateProvider) return;
final state = driver.createSchemaState(
connection: dataSource.connection,
ledgerTable: 'orm_migrations',
);
if (state == null || !state.canDump) return;
await state.dump(File('database/schema.sql'));
}