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,同时需要依赖pymongopip 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
相关产品推荐
相关产品推荐

