Skip to content

Chapter 5: Database Operations ​

5.1 Django Database Configuration ​

Supported Databases ​

Django officially supports multiple database backends:

  • PostgreSQL - via django.db.backends.postgresql
  • MySQL - via django.db.backends.mysql
  • SQLite - via django.db.backends.sqlite3
  • Oracle - via django.db.backends.oracle

Database Connection Configuration ​

Configure databases in settings.py:

python
# SQLite configuration example
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# PostgreSQL configuration example
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

# MySQL configuration example
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}

Configuration Parameter Explanation ​

  • ENGINE: Database backend engine
  • NAME: Database name (file path for SQLite)
  • USER: Database username
  • PASSWORD: Database password
  • HOST: Database host address
  • PORT: Database port
  • OPTIONS: Additional database options

Multiple Database Configuration ​

Django supports configuring multiple database connections:

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'primary_db',
        # ... other configurations
    },
    'read_replica': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'replica_db',
        # ... other configurations
    },
    'analytics': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'analytics_db',
        # ... other configurations
    }
}

Database Routing ​

For multiple database configurations, database routing can be used to control data read/write:

python
# Configure database routing in settings.py
DATABASE_ROUTERS = ['path.to.PrimaryReplicaRouter']

# Database routing example
class PrimaryReplicaRouter:
    def db_for_read(self, model, **hints):
        return 'read_replica'

    def db_for_write(self, model, **hints):
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return db == 'default'

Environment Variable Configuration ​

In production environments, it's recommended to use environment variables to configure databases:

python
import os
from pathlib import Path

# Get configuration from environment variables
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('DB_NAME', 'mydatabase'),
        'USER': os.getenv('DB_USER', 'myuser'),
        'PASSWORD': os.getenv('DB_PASSWORD', 'mypassword'),
        'HOST': os.getenv('DB_HOST', 'localhost'),
        'PORT': os.getenv('DB_PORT', '5432'),
    }
}

Test Database Configuration ​

python
# Test environment database configuration
if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    }

Connection Pool Configuration ​

For production environments, consider using connection pooling:

python
# Using django-db-connections for connection pool configuration
DATABASES = {
    'default': {
        'ENGINE': 'django_db_connections.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
        'OPTIONS': {
            'pool_size': 20,
            'max_overflow': 10,
            'timeout': 30,
        }
    }
}

Best Practices ​

  1. Use environment variables: Don't hardcode database credentials in code
  2. Use SQLite for development: Convenient for development and testing
  3. Use PostgreSQL for production: More powerful features and better performance
  4. Configure connection pooling: Improve database connection efficiency
  5. Regular backups: Ensure data security
  6. Monitor database performance: Use tools like Django Debug Toolbar

Common Problem Solutions ​

Connection timeout issue:

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        # ... other configurations
        'OPTIONS': {
            'connect_timeout': 10,
        }
    }
}

Character set issue:

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # ... other configurations
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': "SET NAMES 'utf8mb4'",
        }
    }
}

Summary ​

Database configuration is an important foundation for Django applications:

  1. ✅ Supports multiple database backends (PostgreSQL, MySQL, SQLite, Oracle)
  2. ✅ Flexible single and multiple database configurations
  3. ✅ Protect sensitive information through environment variables
  4. ✅ Use database routing to implement read/write separation
  5. ✅ Configure connection pooling to improve performance

Proper database configuration can ensure the stability, security, and performance of applications.

Next ​

We will learn about Django's migration system and how to manage database schema changes.

5.2 Data Migration →

Contents ​

Back to Course Outline

Released under the [BY-NC-ND License](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.en).