Interview question
What are Django Migrations and how do you manage database schema changes? Django Migrations क्या हैं? Database schema changes कैसे manage करते हैं?
Answer
Migrations are version control for database schema. Django automatically detects model changes and generates migration files. Use makemigrations to create migrations and migrate to apply them. Manage schema changes safely without data loss.
// Migration Workflow
// Step 1: Create migration files
python manage.py makemigrations
// Detects changes in models.py
// Generates migration files in migrations/ folder
// Step 2: Review migrations
cat myapp/migrations/0001_initial.py
// Step 3: Apply migrations
python manage.py migrate
// Runs all unapplied migrations
// Updates database schema
// Step 4: Verify
python manage.py showmigrations
// Shows which migrations are applied
// Example Migration File
# myapp/migrations/0001_initial.py
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name='Product',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('price', models.DecimalField(decimal_places=2, max_digits=10)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
]
// Migration for Field Change
# myapp/migrations/0002_add_quantity.py
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='product',
name='quantity',
field=models.IntegerField(default=0),
),
]
// Common Migration Operations
// Add field
migrations.AddField(
model_name='product',
name='description',
field=models.TextField(default=''),
)
// Remove field
migrations.RemoveField(
model_name='product',
name='old_field',
)
// Rename field
migrations.RenameField(
model_name='product',
old_name='price',
new_name='selling_price',
)
// Alter field
migrations.AlterField(
model_name='product',
name='price',
field=models.DecimalField(decimal_places=3, max_digits=10),
)
// Create model
migrations.CreateModel(
name='Category',
fields=[
('id', models.BigAutoField(primary_key=True)),
('name', models.CharField(max_length=100)),
],
)
// Delete model
migrations.DeleteModel(
name='OldModel',
)
// Data migration - modify existing data
python manage.py makemigrations --empty myapp --name populate_data
# Then edit the migration file
from django.db import migrations
def populate_categories(apps, schema_editor):
Product = apps.get_model('myapp', 'Product')
for product in Product.objects.all():
# Modify data
pass
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_previous_migration'),
]
operations = [
migrations.RunPython(populate_categories),
]
// Useful Commands
python manage.py makemigrations # Create migration files
python manage.py makemigrations myapp # Only for myapp
python manage.py migrate # Apply all migrations
python manage.py migrate myapp # Apply only myapp migrations
python manage.py migrate myapp 0002 # Migrate to specific version
python manage.py migrate myapp zero # Revert all migrations
python manage.py showmigrations # Show migration status
python manage.py sqlmigrate myapp 0001 # Show SQL for migration
python manage.py makemigrations --dry-run # Preview changes
// Best Practices
// 1. Run makemigrations after model changes
// 2. Review generated migrations before applying
// 3. Test migrations on development first
// 4. Never modify applied migrations
// 5. Create new migration for changes
// 6. Use data migrations for data transformation
// 7. Version control all migration files
// 8. Keep migrations atomic (single purpose)Django Migrations:
Kya हैं:
Database schema का version control
Workflow:
1. Model change करो
2. python manage.py makemigrations
3. Review migration files
4. python manage.py migrate
5. Database updated
Migration File:
Operations define करते हैं
- CreateModel
- AddField
- RemoveField
- AlterField
- RenameField
Data Migration:
Data transform करने के लिए
RunPython operation use करना
Commands:
makemigrations - Create files
migrate - Apply migrations
showmigrations - Show status
sqlmigrate - Show SQL
Best Practice:
- Review migrations
- Test पहले
- Never modify applied
- Atomic changes
- Version control
Benefit:
- Safe schema changes
- Rollback capability
- History tracking
- Collaboration friendlyWas this answer clear?