我有2个mysql数据库,我想为第二个数据库创建一个新模型(analysis_db),但是在运行makemigrations之后,它显示“未检测到更改”。这是我的代码
在settings.py中(我将myapp添加到INSTALLED_APPS中)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': DB_DEFAULT_NAME,
'USER': DB_USER,
'PASSWORD': DB_PASSWORD,
'HOST': DB_HOST,
'PORT': '',
'OPTIONS': {
'sql_mode': 'traditional',
}
},
'analysis_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': DB_ANALYSIS_NAME,
'USER': DB_USER,
'PASSWORD': DB_PASSWORD,
'HOST': DB_HOST,
'PORT': '',
'OPTIONS': {
'sql_mode': 'traditional',
}
}
}
DATABASE_ROUTERS = ['my_project.routers.TestRouter']
在routers.py
class TestRouter:
"""
A router to control all database operations on models in the
auth application.
"""
def db_for_read(self, model, **hints):
if model._meta.app_label == 'analysis_data':
return 'analysis_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'analysis_data':
return 'analysis_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'analysis_data' or \
obj2._meta.app_label == 'analysis_data':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'analysis_data':
return db == 'analysis_db'
return None
在models.py
中class TestModel(models.Model):
id = models.AutoField(primary_key=True)
val1 = models.IntegerField()
val2 = models.IntegerField()
class Meta:
app_label = 'analysis_data'
db_table = 'test_table_on_db'
但是,如果我从app_label = 'analysis_data'
中删除了models.py
,然后再次运行makemigrations
,它可以工作,但是该表是在默认数据库上创建的。有人遇到同样的问题吗?
谢谢:)
答案 0 :(得分:1)
我认为您的模型上的“ app_label”需要设置为INSTALLED_APPS设置中安装的应用程序的名称。您提到您在INSTALLED_APPS中添加了“ myapp”,但是“ analysis_data”呢?
如果您使用的应用程序名称为“ analysis_data”,并且没有该名称的应用程序,则该应用程序将不存在,因为该应用程序不存在。
因此,要解决此问题,您应该将模型的“ analysis_data”移动到另一个Django应用程序(您可以在同一项目中拥有多个应用程序),并将其显式添加到INSTALLED_APPS中。然后,当您运行python manage.py makemigrations analysis_data
时,它应该可以工作。