1pub mod ast_parser;
39pub mod auto_migration;
40pub mod autodetector;
41pub mod dependency;
42pub mod di_support;
43pub mod executor;
44pub mod fields;
45pub mod graph;
46pub mod introspect;
47pub mod introspection;
48pub mod migration;
49pub mod migration_namer;
50pub mod migration_numbering;
51pub mod model_registry;
52pub mod operation_trait;
53pub mod operations;
54pub mod plan;
55pub mod recorder;
56pub mod registry;
57pub mod repository;
58pub mod schema_diff;
59pub mod schema_editor;
60pub mod service;
61pub mod source;
62pub mod squash;
63pub mod state_loader;
64pub mod visualization;
65pub mod zero_downtime;
66
67#[cfg(feature = "contenttypes")]
68pub use crate::contenttypes::migration::MigrationRecord;
69pub use autodetector::{
70 ChangeTracker,
72 ConstraintDefinition,
73 DetectedChanges,
74 FieldState,
75 ForeignKeyAction,
76 ForeignKeyConstraintInfo,
77 ForeignKeyInfo,
78 IndexDefinition,
79 InferenceEngine,
80 InferenceRule,
81 InferredIntent,
82 InteractiveAutodetector,
83 MigrationAutodetector,
84 MigrationPrompt,
85 ModelState,
86 OperationRef,
87 PatternMatcher,
88 ProjectState,
89 RuleCondition,
90 SimilarityConfig,
91 to_snake_case,
92};
93pub use dependency::{
94 DependencyCondition, DependencyResolutionContext, DependencyResolver, MigrationDependency,
95 OptionalDependency, SwappableDependency,
96};
97pub use di_support::{MigrationConfig, MigrationService as DIMigrationService};
98pub use executor::{DatabaseMigrationExecutor, ExecutionResult, OperationOptimizer};
99pub use fields::FieldType;
100pub use graph::{MigrationGraph, MigrationKey, MigrationNode};
101pub use migration::Migration;
102pub use migration_namer::MigrationNamer;
103pub use migration_numbering::MigrationNumbering;
104pub use model_registry::{
105 FieldMetadata, ManyToManyMetadata, ModelMetadata, ModelRegistry, RelationshipMetadata,
106 global_registry,
107};
108pub use operation_trait::MigrationOperation;
109pub use operations::{
110 AddColumn, AlterColumn, AlterTableOptions, BulkLoadFormat, BulkLoadOptions, BulkLoadSource,
111 ColumnDefinition, Constraint, CreateTable, DeferrableOption, DropColumn, IndexType,
112 InterleaveSpec, MySqlAlgorithm, MySqlLock, Operation, PartitionDef, PartitionOptions,
113 PartitionType, PartitionValues, SqlDialect, field_type_string_to_field_type,
114};
115pub use plan::{MigrationPlan, TransactionMode};
116
117pub use auto_migration::{
119 AutoMigrationError, AutoMigrationGenerator, AutoMigrationResult, ValidationResult,
120};
121pub use operations::{
122 AddField, AlterField, CreateCollation, CreateExtension, CreateModel, DeleteModel,
123 DropExtension, FieldDefinition, MoveModel, RemoveField, RenameField, RenameModel, RunCode,
124 RunSQL, StateOperation, special::DataMigration,
125};
126pub use recorder::{DatabaseMigrationRecorder, MigrationRecorder};
127pub use repository::{MigrationRepository, filesystem::FilesystemRepository};
128pub use schema_diff::{
129 ColumnSchema, ConstraintSchema, DatabaseSchema, ForeignKeySchemaInfo, IndexSchema, SchemaDiff,
130 SchemaDiffResult, TableSchema,
131};
132pub use schema_editor::SchemaEditor;
133pub use service::MigrationService;
134pub use source::{
135 MigrationSource, composite::CompositeSource, filesystem::FilesystemSource,
136 registry::RegistrySource,
137};
138pub use squash::{MigrationSquasher, SquashOptions};
139pub use state_loader::MigrationStateLoader;
140pub use visualization::{HistoryEntry, MigrationStats, MigrationVisualizer, OutputFormat};
141pub use zero_downtime::{MigrationPhase, Strategy, ZeroDowntimeMigration};
142
143pub use introspect::{
144 GeneratedFile, GeneratedOutput, GenerationConfig, IntrospectConfig, NamingConvention,
145 OutputConfig, SchemaCodeGenerator, TableFilterConfig, TypeMapper, TypeMappingError,
146 escape_rust_keyword, generate_models, preview_output, sanitize_identifier, to_pascal_case,
147 write_output,
148};
149pub use introspection::{
150 ColumnInfo, DatabaseIntrospector, ForeignKeyInfo as IntrospectionForeignKeyInfo, IndexInfo,
151 TableInfo, UniqueConstraintInfo,
152};
153
154pub use crate::backends::{DatabaseConnection, DatabaseType};
156
157use thiserror::Error;
158
159pub trait MigrationProvider {
191 fn migrations() -> Vec<Migration>;
195}
196
197#[non_exhaustive]
199#[derive(Debug, Error)]
200pub enum MigrationError {
201 #[error("Migration not found: {0}")]
203 NotFound(String),
204
205 #[error("Dependency error: {0}")]
207 DependencyError(String),
208
209 #[error("SQL error: {0}")]
211 SqlError(#[from] sqlx::Error),
212
213 #[error("Database error: {0}")]
215 DatabaseError(#[from] crate::backends::QueryDatabaseError),
216
217 #[error("Invalid migration: {0}")]
219 InvalidMigration(String),
220
221 #[error("Irreversible migration: {0}")]
223 IrreversibleError(String),
224
225 #[error("IO error: {0}")]
227 IoError(#[from] std::io::Error),
228
229 #[error("Format error: {0}")]
231 FmtError(#[from] std::fmt::Error),
232
233 #[error("Circular dependency detected: {cycle}")]
235 CircularDependency {
236 cycle: String,
238 },
239
240 #[error("Node not found: {message} - {node}")]
242 NodeNotFound {
243 message: String,
245 node: String,
247 },
248
249 #[error("Introspection error: {0}")]
251 IntrospectionError(String),
252
253 #[error("Unsupported database: {0}")]
255 UnsupportedDatabase(String),
256
257 #[error("Duplicate operations: {0}")]
263 DuplicateOperations(String),
264
265 #[error("Foreign key violation: {0}")]
271 ForeignKeyViolation(String),
272
273 #[error("Path traversal detected: {0}")]
279 PathTraversal(String),
280}
281
282pub type Result<T> = std::result::Result<T, MigrationError>;
284
285pub mod prelude {
288 pub use super::fields::prelude::*;
289 pub use super::{ColumnDefinition, Constraint, ForeignKeyAction, Migration, Operation};
290}