Skip to content

Django Management Commands

DBCrust provides seamless integration with Django’s management command system, allowing you to access your Django databases using DBCrust’s advanced features directly through familiar Django workflows. This guide covers all Django-specific commands and integration patterns.

Connect to your Django databases using the same settings Django uses:

Terminal window
# Connect to default database
cd your_django_project/
python manage.py dbcrust
# Connect to specific database from DATABASES setting
python manage.py dbcrust --database analytics
python manage.py dbcrust --database users
python manage.py dbcrust --database cache

That’s it! DBCrust automatically reads your Django database configuration and connects with the same credentials Django uses.

Launch DBCrust interactive session using Django database settings.

Terminal window
# Basic usage
python manage.py dbcrust # Default database
python manage.py dbcrust --database users # Specific database
# With additional options
python manage.py dbcrust --debug # Enable debug output
python manage.py dbcrust --no-banner # Skip startup banner
python manage.py dbcrust --read-only # Read-only connection

Options:

  • --database DB: Use specific database from Django settings
  • --debug: Enable debug logging
  • --no-banner: Skip DBCrust startup banner
  • --read-only: Open read-only connection
  • --sql-timeout N: Set query timeout in seconds

Analyze Django ORM performance across your application.

Terminal window
# Analyze all models and views
python manage.py dbcrust_analyze
# Analyze specific app
python manage.py dbcrust_analyze --app myapp
# Analyze specific models
python manage.py dbcrust_analyze --models User,Order,Product
# Generate detailed report
python manage.py dbcrust_analyze --report detailed --output report.html

Options:

  • --app APP: Analyze specific Django app
  • --models MODELS: Comma-separated list of models to analyze
  • --views: Include view analysis
  • --report FORMAT: Report format (summary, detailed, json)
  • --output FILE: Save report to file
  • --slow-queries: Focus on slow query detection
  • --n-plus-one: Focus on N+1 query detection

Verify migration performance and detect potential issues.

Terminal window
# Check pending migrations
python manage.py dbcrust_migrate_check
# Analyze migration performance impact
python manage.py dbcrust_migrate_check --analyze-impact
# Check for dangerous operations
python manage.py dbcrust_migrate_check --check-safety

Profile Django views for database performance.

Terminal window
# Profile all views
python manage.py dbcrust_profile_views
# Profile specific views
python manage.py dbcrust_profile_views --views book_list,author_detail
# Run with test data
python manage.py dbcrust_profile_views --use-fixtures

Example output:

📊 Django View Performance Profile
==================================
book_list (/books/):
✅ Queries: 3 (good)
⚠️ Duration: 1.2s (slow)
🔴 N+1 detected: author.name accessed 50 times
💡 Fix: Book.objects.select_related('author')
author_detail (/authors/{id}/):
✅ Queries: 2 (good)
✅ Duration: 45ms (fast)
💡 Consider: prefetch_related('books') for related books

Generate comprehensive model usage statistics.

Terminal window
# Statistics for all models
python manage.py dbcrust_model_stats
# Specific models
python manage.py dbcrust_model_stats --models User,Order
# Include relationship analysis
python manage.py dbcrust_model_stats --include-relations

Static analysis of Python code for ORM performance issues.

Terminal window
# Analyze entire codebase
python manage.py dbcrust_analyze_code
# Analyze specific files
python manage.py dbcrust_analyze_code --files views.py,models.py
# Auto-fix simple issues
python manage.py dbcrust_analyze_code --auto-fix

Detects:

  • Missing select_related() calls
  • Missing prefetch_related() calls
  • Queries in loops
  • Inefficient filter patterns
  • Missing database indexes

python manage.py dbcrust_generate_optimizations

Section titled “python manage.py dbcrust_generate_optimizations”

Generate optimization suggestions for Django models and queries.

Terminal window
# Generate optimizations for all models
python manage.py dbcrust_generate_optimizations
# Focus on specific issues
python manage.py dbcrust_generate_optimizations --focus n-plus-one
python manage.py dbcrust_generate_optimizations --focus indexes
python manage.py dbcrust_generate_optimizations --focus queries
# Generate code patches
python manage.py dbcrust_generate_optimizations --generate-patches

DBCrust automatically integrates with your Django database configuration:

settings.py
# Standard Django database config
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myapp_prod',
'USER': 'myapp',
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': 'db.company.com',
'PORT': '5432',
},
'analytics': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'analytics',
'USER': 'analyst',
'PASSWORD': os.getenv('ANALYTICS_DB_PASSWORD'),
'HOST': 'analytics.company.com',
'PORT': '5432',
},
'cache': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'cache.sqlite3',
}
}
# DBCrust-specific settings (optional)
DBCRUST = {
# Default database for management commands
'DEFAULT_DATABASE': 'default',
# Analysis settings
'ANALYSIS': {
'ENABLED': True,
'AUTO_ANALYZE_MIGRATIONS': True,
'DETECT_N_PLUS_ONE': True,
'SUGGEST_INDEXES': True,
},
# Command-specific settings
'COMMANDS': {
'dbcrust': {
'AUTO_CONNECT': True,
'SHOW_BANNER': True,
'READ_ONLY_DEFAULT': False,
},
'dbcrust_analyze': {
'DEFAULT_FORMAT': 'detailed',
'INCLUDE_STACK_TRACES': True,
}
}
}
settings/production.py
DBCRUST = {
'COMMANDS': {
'dbcrust': {
'READ_ONLY_DEFAULT': True, # Default to read-only in production
'REQUIRE_CONFIRMATION': True, # Confirm destructive operations
}
}
}
# settings/development.py
DBCRUST = {
'ANALYSIS': {
'AUTO_ANALYZE_MIGRATIONS': True,
'REAL_TIME_ANALYSIS': True,
}
}

DBCrust understands Django models and provides enhanced introspection:

-- Inside DBCrust session via `python manage.py dbcrust`
-- List Django models (not just tables)
\dt
-- Shows: auth_user, auth_group, myapp_book, myapp_author, etc.
-- Describe Django model with relationship info
\d auth_user
-- Shows fields with Django field types and relationships
-- Django-specific table analysis
\d myapp_book
-- Shows:
-- - Django field types (CharField, ForeignKey, etc.)
-- - Relationship information
-- - Custom model methods
-- - Admin integration status

Analyze Django migrations before applying:

Terminal window
# Check migration safety
python manage.py dbcrust_migrate_check
# Analyze specific migration
python manage.py dbcrust_migrate_check --migration 0023_add_index
# Performance impact analysis
python manage.py dbcrust_migrate_check --analyze-impact --database default

Example output:

🔍 Django Migration Analysis
============================
Pending migrations for 'myapp':
0023_add_index: Adding index to User.email
0024_alter_book_title: Changing Book.title max_length
Analysis Results:
0023_add_index:
✅ Safe operation
⏱️ Estimated time: 2.3s (User table has 50K rows)
🔒 Locking: Minimal (CONCURRENT index creation)
💡 Recommendation: Apply during low traffic
0024_alter_book_title:
⚠️ Requires table rewrite
⏱️ Estimated time: 45s (Book table has 500K rows)
🔒 Locking: Full table lock
⚠️ Recommendation: Apply during maintenance window

Automatically detect common Django ORM anti-patterns:

# This command analyzes your codebase
python manage.py dbcrust_analyze_code --patterns django-orm

Detected patterns:

# ❌ N+1 Query Pattern Detected
# File: views.py, Line: 45
books = Book.objects.all()
for book in books:
print(book.author.name) # Triggers N+1
# 💡 Suggested fix:
books = Book.objects.select_related('author').all()
# ❌ Query in Template Loop Detected
# File: templates/books/list.html, Line: 12
{% for book in books %}
{{ book.reviews.count }} {# Query per book #}
{% endfor %}
# 💡 Suggested fix:
books = Book.objects.prefetch_related('reviews').all()
# ❌ Missing Database Index Detected
# File: models.py, Line: 23
class Book(models.Model):
isbn = models.CharField(max_length=13) # Frequently filtered, no index
# 💡 Suggested fix:
class Book(models.Model):
isbn = models.CharField(max_length=13, db_index=True)

Create Django-specific analysis rules:

myapp/dbcrust_django_rules.py
from dbcrust.django.analyzers import DjangoAnalyzer
class CustomDjangoAnalyzer(DjangoAnalyzer):
"""Custom Django ORM analysis rules"""
def analyze_queryset_patterns(self, view_name, querysets):
"""Analyze Django-specific patterns"""
issues = []
for qs in querysets:
# Check for missing pagination on list views
if 'list' in view_name.lower():
if not hasattr(qs, 'paginator') and qs.count() > 50:
issues.append({
'type': 'missing_pagination',
'severity': 'warning',
'message': f'List view returns {qs.count()} objects without pagination',
'suggestion': 'Use Django Paginator or limit queryset'
})
# Check for inefficient datetime filters
query_sql = str(qs.query)
if 'created_at >=' in query_sql and 'created_at <' not in query_sql:
issues.append({
'type': 'inefficient_datetime_filter',
'severity': 'info',
'message': 'Open-ended datetime filter may be slow',
'suggestion': 'Add upper bound to datetime filters'
})
return issues
def analyze_model_usage(self, model_class):
"""Analyze Django model usage patterns"""
issues = []
# Check for missing Meta.indexes
if hasattr(model_class._meta, 'get_fields'):
for field in model_class._meta.get_fields():
if hasattr(field, 'db_index') and not field.db_index:
if field.name in ['email', 'username', 'slug']:
issues.append({
'type': 'missing_common_index',
'model': model_class.__name__,
'field': field.name,
'suggestion': f'Consider adding db_index=True to {field.name}'
})
return issues
settings.py
DBCRUST = {
'CUSTOM_ANALYZERS': [
'myapp.dbcrust_django_rules.CustomDjangoAnalyzer',
]
}

Integrate with Django tests to prevent performance regressions:

test_performance.py
from django.test import TestCase
from django.core.management import call_command
from django.test.utils import override_settings
class PerformanceRegressionTest(TestCase):
"""Prevent Django ORM performance regressions"""
def test_view_performance_baseline(self):
"""Ensure views don't exceed performance baselines"""
# Run performance analysis
result = call_command(
'dbcrust_profile_views',
views='book_list,author_detail',
verbosity=0,
return_result=True
)
# Check performance baselines
baselines = {
'book_list': {'max_queries': 5, 'max_duration': 1000},
'author_detail': {'max_queries': 3, 'max_duration': 500}
}
for view, baseline in baselines.items():
view_result = result[view]
self.assertLessEqual(
view_result['query_count'],
baseline['max_queries'],
f"{view} exceeded query limit: {view_result['query_count']} > {baseline['max_queries']}"
)
self.assertLessEqual(
view_result['duration_ms'],
baseline['max_duration'],
f"{view} exceeded duration limit: {view_result['duration_ms']}ms > {baseline['max_duration']}ms"
)
def test_model_efficiency(self):
"""Test model usage efficiency"""
result = call_command(
'dbcrust_analyze_code',
files='views.py,models.py',
verbosity=0,
return_result=True
)
# No critical issues allowed
critical_issues = [issue for issue in result if issue['severity'] == 'critical']
self.assertEqual(
len(critical_issues), 0,
f"Critical ORM issues found: {critical_issues}"
)

Monitor Django ORM performance in production:

management/commands/dbcrust_production_monitor.py
from django.core.management.base import BaseCommand
from dbcrust.django.monitoring import ProductionMonitor
class Command(BaseCommand):
help = 'Monitor Django ORM performance in production'
def add_arguments(self, parser):
parser.add_argument('--duration', type=int, default=300, help='Monitor duration in seconds')
parser.add_argument('--sample-rate', type=float, default=0.1, help='Sampling rate (0.1 = 10%)')
def handle(self, *args, **options):
monitor = ProductionMonitor(
sample_rate=options['sample_rate'],
alert_thresholds={
'query_count': 20,
'duration_ms': 5000,
'n_plus_one_count': 3
}
)
self.stdout.write(f"Starting production monitoring for {options['duration']} seconds...")
results = monitor.run(duration=options['duration'])
# Report findings
if results['alerts']:
self.stdout.write("🚨 Performance alerts:")
for alert in results['alerts']:
self.stdout.write(f" - {alert['message']}")
self.stdout.write(f"✅ Monitoring complete. Sampled {results['requests_monitored']} requests.")

Command not found:

Terminal window
# Ensure DBCrust is in INSTALLED_APPS
python manage.py shell
>>> from django.conf import settings
>>> 'dbcrust.django' in settings.INSTALLED_APPS
True

Database connection issues:

Terminal window
# Test Django database connection first
python manage.py dbshell
# Check specific database
python manage.py dbcrust --database analytics --debug

Permission issues:

Terminal window
# Check database user permissions
python manage.py dbcrust --read-only

Analysis not working:

# Check Django settings
DBCRUST = {
'ANALYSIS': {
'ENABLED': True, # Must be True
}
}

Enable detailed debugging for Django integration:

Terminal window
# Enable Django debug logging
export DJANGO_LOG_LEVEL=DEBUG
# Enable DBCrust debug logging
export DBCRUST_DEBUG=1
# Run command with debugging
python manage.py dbcrust --debug
Terminal window
# Daily development routine
python manage.py dbcrust_analyze --app myapp # Check for issues
python manage.py dbcrust_migrate_check # Verify migrations
python manage.py dbcrust --database default # Interactive analysis
# Before committing code
python manage.py dbcrust_analyze_code --auto-fix # Fix simple issues
python manage.py test test_performance # Run performance tests
Terminal window
# Code review preparation
python manage.py dbcrust_generate_optimizations --generate-patches
# Performance monitoring
python manage.py dbcrust_production_monitor --duration 3600 # 1 hour
# Regular health checks
python manage.py dbcrust_model_stats --include-relations
Terminal window
# In your CI pipeline
python manage.py dbcrust_analyze_code --fail-on-critical
python manage.py dbcrust_profile_views --baseline performance_baseline.json
python manage.py test test_performance