将Django项目从MySQL转换为Mongo,有哪些主要问题?

2 投票
6 回答
2929 浏览
提问于 2025-04-16 10:08

我想试试用MongoDB和mongoengine。对于Django和数据库我还是个新手,最近在处理外键、连接、循环导入等问题时遇到了很多麻烦。我知道我最终可以解决这些问题,但Mongo看起来对我现在做的事情来说更简单。我的问题是,我在使用很多可插拔的应用(比如Imagekit、Haystack、Registration等等),我想知道如果我换成MongoDB,这些应用还能继续使用吗?我会遇到什么已知的问题吗?如果有的话,我可能还是继续用MySQL算了。

6 个回答

1

我之前在Django中用过mongoengine,但你需要创建一个像mongo_models.py这样的文件。在这个文件里,你定义你的Mongo文档。然后你需要创建表单来对应每个Mongo文档。每个表单都有一个保存方法,用来插入或更新存储在Mongo里的数据。Django的表单设计得很灵活,可以和任何数据后端连接(只要稍微调整一下)。

要注意:如果你的数据结构非常明确且有条理,可以用文档或模型来描述,那就不要用Mongo。因为Mongo并不是为这种情况设计的,像PostGreSQL这样的数据库会更合适。

  • 我用PostGreSQL来处理关系型或结构良好的数据,因为它在这方面表现很好。占用内存少,响应速度快。
  • 我用Redis来缓存数据或处理内存中的队列/列表,因为它在这方面很出色。只要你的内存足够,性能非常好。
  • 我用Mongo来存储大型JSON文档,并在需要时对它们进行Map和Reduce操作,因为它在这方面很强大。如果可以的话,记得在某些列上使用索引,以加快查找速度。

不要试图用圆形去填补方形的洞。这样是填不满的。

我见过太多帖子,有人想用Mongo替代关系型数据库,只因为Mongo这个词很流行。别误会我,Mongo确实很棒……但前提是你要用对地方。我喜欢在合适的场合使用Mongo。

3

你可以看看 django-nonrel,这是一个年轻但很有潜力的项目,旨在为Django提供NoSQL数据库支持。现在文档还不太完善,但如果你自己动手试试,它的效果还是很不错的。

9

其实,你完全可以在标准的Django应用中使用常见的关系型数据库(RDBMS),然后在你的应用里使用MongoDB。这样的话,你只需要把Django ORM(对象关系映射)处理数据的方式换成MongoDB的方式就行了。

不过,你可以继续使用urls.py来处理网址和匹配规则,视图函数依然可以接收参数,模板也可以继续使用对象。

不过,你会失去查询集(querysets),因为它们和关系型数据库的模型关系太紧密了。但其实查询集就是懒加载的列表而已。你可以不理会Django文档里关于如何写models.py的内容,直接用MongoDB的方式来编写你的数据库业务逻辑。

哦,对了,你将无法使用Django的管理界面来方便地访问你的数据。

撰写回答