Skip to content

数据库与 ORM

说明

项目使用 Django ORM 作为数据库访问层,数据库连接配置位于 config/env.pyapplication/settings.py。默认使用 MySQL 数据库,通过 django.db.backends.mysql 引擎连接。

数据库配置

环境变量(config/env.py)

python
# 数据库引擎,默认 MySQL
DATABASE_ENGINE = os.getenv('DATABASE_ENGINE', "django.db.backends.mysql")

# 数据库名称
DATABASE_NAME = os.getenv('DATABASE_NAME', 'djangoadmin.django.elevue')

# 数据库地址
DATABASE_HOST = os.getenv('DATABASE_HOST', "127.0.0.1")

# 数据库端口
DATABASE_PORT = os.getenv('DATABASE_PORT', 3306)

# 数据库用户名
DATABASE_USER = os.getenv('DATABASE_USER', 'root')

# 数据库密码
DATABASE_PASSWORD = os.getenv('DATABASE_PASSWORD', 'root')

# 数据表前缀
DATABASE_PREFIX = os.getenv('DATABASE_PREFIX', "django_")

Django Settings(application/settings.py)

python
DATABASES = {
    "default": {
        "ENGINE": env.DATABASE_ENGINE,
        "NAME": env.DATABASE_NAME,
        "USER": env.DATABASE_USER,
        "PASSWORD": env.DATABASE_PASSWORD,
        "HOST": env.DATABASE_HOST,
        "PORT": env.DATABASE_PORT,
    }
}

MySQL 引擎配置

项目默认使用 django.db.backends.mysql 引擎,需要安装 mysqlclientPyMySQL

bash
# 方式一:mysqlclient(推荐,C 扩展,性能更好)
pip install mysqlclient

# 方式二:PyMySQL(纯 Python,兼容性更好)
pip install PyMySQL

如果使用 PyMySQL,需要在 application/__init__.py 中添加:

python
import pymysql
pymysql.install_as_MySQLdb()

数据表前缀

所有业务数据表自动添加 DATABASE_PREFIX 前缀(默认 django_),便于多应用共存:

python
# utils/common.py
def get_table_name(base_name):
    """获取带前缀的表名"""
    prefix = getattr(settings, 'DATABASE_PREFIX', '')
    return f"{prefix}{base_name}"

ORM 查询模式

基础查询

python
from application.example.models import Example

# 查询未删除的记录(软删除)
queryset = Example.objects.filter(is_delete=False)

# 条件过滤
queryset = queryset.filter(name__contains=name)  # 模糊查询
queryset = queryset.filter(status=status)         # 精确匹配
queryset = queryset.order_by("sort")              # 排序

分页查询

python
from django.core.paginator import Paginator, PageNotAnInteger, InvalidPage, EmptyPage

paginator = Paginator(queryset, page_size)
try:
    page_list = paginator.page(page_no)
except (PageNotAnInteger, InvalidPage, EmptyPage):
    page_list = paginator.page(1)

# 构建分页数据
page_data = {
    'records': [item for item in page_list],
    'total': paginator.count,
    'size': page_size,
    'current': page_no,
    'pages': paginator.num_pages,
}

创建记录

python
Example.objects.create(
    name="示例",
    status=1,
    create_user=get_username(request),
    update_user=get_username(request),
)

更新记录

python
instance = Example.objects.filter(id=instance_id, is_delete=False).first()
if instance:
    instance.name = "新名称"
    instance.update_user = get_username(request)
    instance.save()

批量更新(逻辑删除)

python
Example.objects.filter(id__in=id_list, is_delete=False).update(is_delete=True)

软删除机制

所有业务模型继承 BaseModel,包含 is_delete 字段。所有查询都过滤 is_delete=False,删除操作为逻辑删除:

python
# application/models.py
class BaseModel(models.Model):
    id = models.BigAutoField(primary_key=True)
    create_user = models.CharField(max_length=64, default='', null=True, blank=True)
    create_time = models.DateTimeField(auto_now_add=True)
    update_user = models.CharField(max_length=64, default='', null=True, blank=True)
    update_time = models.DateTimeField(auto_now=True)
    is_delete = models.BooleanField(default=False)

    class Meta:
        abstract = True

缓存配置(Redis)

Redis 用于 JWT Token 黑名单和权限缓存:

python
# application/settings.py
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": f"redis://{env.REDIS_HOST}:{env.REDIS_PORT}/{env.REDIS_DB}",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": env.REDIS_PASSWORD if env.REDIS_PASSWORD else None,
            "SOCKET_CONNECT_TIMEOUT": 5,
            "SOCKET_TIMEOUT": 5,
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "IGNORE_EXCEPTIONS": True,
        },
        "KEY_PREFIX": "djangoadmin",
    }
}

Redis 配置(config/env.py):

python
REDIS_HOST = os.getenv('REDIS_HOST', '127.0.0.1')
REDIS_PORT = int(os.getenv('REDIS_PORT', 6379))
REDIS_PASSWORD = os.getenv('REDIS_PASSWORD', '123456')
REDIS_DB = int(os.getenv('REDIS_DB', 0))

总结

数据库会话管理由 Django ORM 自动处理,每个请求自动管理数据库连接的生命周期。通过 config/env.py 集中管理数据库和 Redis 连接配置,支持通过环境变量覆盖。软删除机制确保数据安全,所有查询自动过滤已删除记录。

小蚂蚁云团队 · 提供技术支持