Skip to content

第5章:数据库操作

5.1 Django 数据库配置

支持的数据库

Django官方支持多种数据库后端:

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

数据库连接配置

settings.py 中配置数据库:

python
# SQLite 配置示例
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

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

# MySQL 配置示例
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'",
        },
    }
}

配置参数说明

  • ENGINE: 数据库后端引擎
  • NAME: 数据库名称(SQLite中是文件路径)
  • USER: 数据库用户名
  • PASSWORD: 数据库密码
  • HOST: 数据库主机地址
  • PORT: 数据库端口
  • OPTIONS: 额外的数据库选项

多数据库配置

Django支持配置多个数据库连接:

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'primary_db',
        # ... 其他配置
    },
    'read_replica': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'replica_db',
        # ... 其他配置
    },
    'analytics': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'analytics_db',
        # ... 其他配置
    }
}

数据库路由

对于多数据库配置,可以使用数据库路由来控制数据读写:

python
# 在 settings.py 中配置数据库路由
DATABASE_ROUTERS = ['path.to.PrimaryReplicaRouter']

# 数据库路由示例
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'

环境变量配置

在生产环境中,建议使用环境变量来配置数据库:

python
import os
from pathlib import Path

# 从环境变量获取配置
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'),
    }
}

测试数据库配置

python
# 测试环境数据库配置
if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    }

连接池配置

对于生产环境,可以考虑使用连接池:

python
# 使用 django-db-connections 进行连接池配置
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,
        }
    }
}

最佳实践

  1. 使用环境变量:不要在代码中硬编码数据库凭据
  2. 开发环境使用SQLite:便于开发和测试
  3. 生产环境使用PostgreSQL:功能更强大,性能更好
  4. 配置连接池:提高数据库连接效率
  5. 定期备份:确保数据安全
  6. 监控数据库性能:使用Django Debug Toolbar等工具

常见问题解决

连接超时问题

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        # ... 其他配置
        'OPTIONS': {
            'connect_timeout': 10,
        }
    }
}

字符集问题

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # ... 其他配置
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': "SET NAMES 'utf8mb4'",
        }
    }
}

小结

数据库配置是Django应用的重要基础:

  1. ✅ 支持多种数据库后端(PostgreSQL、MySQL、SQLite、Oracle)
  2. ✅ 灵活的单数据库和多数据库配置
  3. ✅ 通过环境变量保护敏感信息
  4. ✅ 使用数据库路由实现读写分离
  5. ✅ 配置连接池提高性能

合理的数据库配置能够确保应用的稳定性、安全性和性能表现。

下一篇

我们将学习Django的迁移系统,了解如何管理数据库模式变更。

5.2 数据迁移 →

目录

返回课程目录

Released under the Apache 2.0 License.