Я пытаюсь подключить внешнюю базу данных mysql к Django только для чтения данных. Я следовал инструкции в соответствии с Django Doc для подключения нескольких БД. Однако, когда я пытаюсь makemigration
/ migrate
новой БД, она возвращает ошибку, как показано ниже. Я провел некоторое исследование на Google и обнаружил, что не так много решений и может решить мою проблему. Это мой первый раз, чтобы увидеть это и не знаю, в чем причина ошибки. Я импортирую модели по inspectdb
, и TotalopennumTmp является одной из моделей в БД. Спасибо за помощь в решении этой проблемы.
ERROR:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/home/app/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
utility.execute()
File "/home/app/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 347, in execute
django.setup()
File "/home/app/venv/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/app/venv/lib/python3.6/site-packages/django/apps/registry.py", line 112, in populate
app_config.import_models()
File "/home/app/venv/lib/python3.6/site-packages/django/apps/config.py", line 198, in import_models
self.models_module = import_module(models_module_name)
File "/home/app/venv/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/app/app/models.py", line 1007, in <module>
class TotalopennumTmp(models.Model):
File "/home/app/venv/lib/python3.6/site-packages/django/db/models/base.py", line 309, in __new__
new_class._meta.apps.register_model(new_class._meta.app_label, new_class)
File "/home/app/venv/lib/python3.6/site-packages/django/apps/registry.py", line 221, in register_model
(model_name, app_label, app_models[model_name], model))
RuntimeError: Conflicting 'totalopennumtmp' models in application 'app': <class 'app.app.models.TotalOpennumTmp'> and <class 'app.app.models.TotalopennumTmp'>.
settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'local',
#skip the detail
},
'afe':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myapp_db',
'USER': 'root',
'PASSWORD': 'pwd',
'HOST': 'mysql_host',
'PORT': 'mysql_port',
}
}
DATABASE_ROUTERS = ['myapp.routers.MyAppRouter',]
routers.py
class MyAppRouter:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'myapp':
return 'myapp_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'myapp' or \
obj2._meta.app_label == 'myapp':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'myapp':
return db == 'myapp_db'
return None
def allow_syncdb(self, db, model):
#make sure myapp only appear on myapp_db db
if db == 'myapp_db':
return model._meta.app_label == 'myapp'
elif model._meta.app_label == 'myapp':
return False
return None
models.py
class TotalOpennumTmp(models.Model):
#some field
class Meta:
managed = False
db_table = 'total_opennum_tmp'
class TotalopennumTmp(models.Model):
#some field
class Meta:
managed = False
db_table = 'totalopennum_tmp'