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