首页 > 解决方案 > 在 django 中为多个数据库运行 manage.py makemigrations

问题描述

我试图在我的 Django 项目中使用多个数据库,即 MongoDB 和 MySQL。

# settings.py
DATABASES = {
    'default': {
        'NAME': 'sql_db',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': 'root'
    },
   'mongoproject': {
      'ENGINE' : 'djongo',
      'NAME': 'mongo_db'
   }
}

我为例如创建我的模型

# App/models.py
class ForSQL(models.Model):
    Name = models.CharField(max_length=50)
    City = models.CharField(max_length=50)

我想把它保存在 MySQL 中。为此,我将运行 manage.py makemigrations,然后运行 ​​manage.py migrate。它将保存在 MySQL 中。

但是当我在 models.py 文件中添加一个表时,例如:

# App/models.py
class Mongo(models.Model):
    Name = models.CharField(max_length=50)
    City = models.CharField(max_length=50)

我想将此表保存在 MongoDB 中。如果我运行 manage.py makemigrations 然后运行 ​​manage.py migrate --database=mongoproject,它会在 MongoDB 中保存“Mongo”表,并且由于之前的迁移,它还会在 MongoDB 中保存“ForSQL”表。

我需要帮助设置路由器以区分每个表上的迁移。我寻找这个解决方案,但无法让他们工作。

标签: django-modelsmultiple-databasesmakemigrations

解决方案


这是我解决问题的方法

# routers.py
import App.models
allmodels = dict([(name.lower(), cls) for name, cls in App.models.__dict__.items() if isinstance(cls, type)])

def allow_migrate(self, db, app_label, model_name = None, **hints):
    """ migrate to appropriate database per model """
    try:
        model = allmodels.get(model_name)
        return(model.params.db == db)
    except:
        pass

# App/models.py
class ForSQL(models.Model):
    class params:
        db = 'default'
    Name = models.CharField(max_length=50)
    City = models.CharField(max_length=50)

class Mongo(models.Model):
    class params:
        db = 'mongoproject'
    Name = models.CharField(max_length=50)
    City = models.CharField(max_length=50)

然后只需运行命令manage.py makemigrationsmanage.py migrate --database=default默认数据库(在我的情况下为 MySQL)和manage.py migrate --database=mongoprojectMongoDB。它将保存ForSQL表格MySQLMongo表格MongoDB

这正是我所需要的。希望它会帮助某人。

这对我有帮助https://stackoverflow.com/a/60453322/12134251


推荐阅读