You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 1.11项目能否同时使用MySQL与MongoDB作为后端数据库?如何实现?

Django 1.11 同时搭配 MySQL 和 MongoDB 的实现方案

当然没问题!Django 1.11完全支持同时使用关系型数据库(比如MySQL)和非关系型数据库(比如MongoDB),我之前在几个项目里这么配置过,下面给你一步步拆解具体实现步骤:

一、先理清核心逻辑

Django本身支持多数据库配置,而MongoDB需要借助第三方后端库(比如django-mongodb-engine)来适配Django的ORM体系,这样就能让两个数据库在同一个项目里各司其职。

二、具体操作步骤

1. 安装对应依赖包

首先得把必要的驱动和集成库装到位,注意要选和Django 1.11兼容的版本,避免踩版本坑:

  • 针对MySQL:安装mysqlclient(这是Django 1.11官方推荐的MySQL驱动)
    pip install mysqlclient==1.3.14
    
  • 针对MongoDB:用django-mongodb-engine,它专门为Django做了适配,能让你用Django原生ORM操作MongoDB,同时需要依赖pymongo
    pip install django-mongodb-engine==0.6.0
    pip install pymongo==3.7.2
    

2. 配置settings.py里的数据库连接

在项目的settings.py中,给两个数据库分别配置连接信息,用不同的别名区分:

DATABASES = {
    # MySQL作为默认数据库,处理结构化数据
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '你的MySQL数据库名',
        'USER': 'MySQL用户名',
        'PASSWORD': 'MySQL密码',
        'HOST': 'localhost',  # 或者你的数据库地址
        'PORT': '3306',
    },
    # MongoDB数据库,处理非结构化/半结构化数据
    'mongodb': {
        'ENGINE': 'django_mongodb_engine',
        'NAME': '你的MongoDB数据库名',
        'HOST': 'localhost',
        'PORT': 27017,
        # 如果MongoDB开启了认证,就加上下面两行
        # 'USER': 'MongoDB用户名',
        # 'PASSWORD': 'MongoDB密码',
    }
}

# 可选但推荐:配置数据库路由,自动帮你把不同模型分配到对应数据库
DATABASE_ROUTERS = ['你的项目名.routers.MyDatabaseRouter']

3. 编写数据库路由(自动分配数据库)

如果想让某些APP的模型自动用MongoDB,另一些用MySQL,写个路由类就搞定了。在项目根目录新建routers.py:

class MyDatabaseRouter:
    # 定义哪些APP的模型用MongoDB,替换成你自己的APP名称
    mongo_apps = ['日志APP', '用户行为APP']

    def db_for_read(self, model, **hints):
        # 读操作时,指定APP的模型用MongoDB
        if model._meta.app_label in self.mongo_apps:
            return 'mongodb'
        # 其他模型用默认的MySQL
        return 'default'

    def db_for_write(self, model, **hints):
        # 写操作同理
        if model._meta.app_label in self.mongo_apps:
            return 'mongodb'
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        # 允许同一数据库内的模型建立关联,跨数据库的关联不支持
        if (obj1._meta.app_label in self.mongo_apps and
            obj2._meta.app_label in self.mongo_apps):
            return True
        elif not (obj1._meta.app_label in self.mongo_apps or
                  obj2._meta.app_label in self.mongo_apps):
            return True
        return False

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # 只在对应数据库执行迁移操作
        if app_label in self.mongo_apps:
            return db == 'mongodb'
        return db == 'default'

4. 创建模型并指定数据库(或依赖路由自动分配)

如果用了路由,模型不用额外配置,路由会自动分配;如果没路由,也可以手动指定模型用哪个数据库:

# 这个模型用默认的MySQL,比如用户信息表
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(unique=True)
    create_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        app_label = '用户中心APP'

# 这个模型用MongoDB,比如用户行为日志,还能用到MongoDB特有的字段类型
from django_mongodb_engine.fields import ListField, DictField

class UserActionLog(models.Model):
    user_id = models.IntegerField()
    action_time = models.DateTimeField(auto_now_add=True)
    action_details = DictField()  # 存储JSON格式的详情
    tags = ListField(models.CharField(max_length=30))  # 存储标签列表

    class Meta:
        app_label = '日志APP'

5. 执行数据库迁移

分别给两个数据库执行迁移命令,创建表结构:

  • MySQL的迁移:
    python manage.py migrate --database=default
    
  • MongoDB的迁移(django-mongodb-engine支持基础的迁移操作):
    python manage.py migrate --database=mongodb
    

6. 在业务代码中操作不同数据库

如果配置了路由,直接像平常一样操作模型就行,路由会自动切换数据库;如果没配置路由,可以手动指定数据库:

# 操作MySQL的User模型
new_user = User.objects.create(username="jack", email="jack@example.com")

# 手动指定用MongoDB操作UserActionLog模型
new_log = UserActionLog.objects.using('mongodb').create(
    user_id=new_user.id,
    action_details={"action": "登录", "ip": "192.168.1.100"},
    tags=["登录", "成功"]
)

三、几个要注意的坑

  • 版本兼容性:一定要严格按照我给的版本号安装依赖,不然Django 1.11可能和新版本的驱动/集成库不兼容,出现各种奇怪的错误。
  • 跨数据库关联:MySQL和MongoDB的模型之间不能直接建外键,因为存储机制完全不同,这种关联逻辑只能在业务代码里手动处理。
  • 业务场景匹配:别为了用而用,结构化、需要事务支持的数据用MySQL,非结构化、需要灵活扩展的数据用MongoDB,合理分工才能发挥各自优势。

内容的提问来源于stack exchange,提问作者Mufeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:08:58