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