Django.db.utils.ConnectionDoesNotExist: Соединение prueba не существует
Я хочу перенести базу данных Django в MongoDB с помощью Djongo, но у меня возникла эта ошибка. Я пытаюсь подключиться к базе данных MongoDB Atlas.
Traceback (most recent call last):
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/db/utils.py", line 167, in ensure_defaults
conn = self.databases[alias]
KeyError: 'prueba'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
utility.execute()
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/core/management/__init__.py", line 365, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/core/management/base.py", line 335, in execute
output = self.handle(*args, **options)
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 74, in handle
connection = connections[db]
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/db/utils.py", line 199, in __getitem__
self.ensure_defaults(alias)
File "/home/alexsaca/python3EnvDec/lib/python3.8/site-packages/django/db/utils.py", line 169, in ensure_defaults
raise ConnectionDoesNotExist("The connection %s doesn't exist" % alias)
django.db.utils.ConnectionDoesNotExist: The connection prueba doesn't exist
Мой settings.py выглядит следующим образом:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'decide',
'PASSWORD': 'decide',
'HOST': '127.0.0.1',
'PORT': '5432',
},
'prueba': {
'ENGINE': 'djongo',
'NAME': 'egc-sierrezuela-2',
'ENFORCE_SCHEMA': False,
'CLIENT': {
'HOST': 'mongodb+srv://usuario:password@egc-sierrezuela-2.fxrpl.mongodb.net/egc-sierrezuela-2?retryWrites=true&w=majority'
}
}
}
Я использую Django==2.0
и djongo==1.2.38
Я перепробовал множество версий djongo, но ошибки все равно возникают. Кроме того, обновление django до последней версии невозможно, так как я использую старый проект.
Есть идеи?
Я получил подобную ошибку, когда не подготовил должным образом файл db_routers (docs). Предположим, что структура вашего приложения выглядит следующим образом:
your-app/
├── app
├── db_routers.py
├── settings.py
В файле настроек необходимо указать путь к маршрутизатору:
DATABASE_ROUTERS = ('db_routers.DatabaseRouter',)
Предположим, что ваши модели - ModelPostgres и ModelMongo, определите файл db_routers следующим образом:
from app.models import ModelPostgres, ModelMongo
class DatabaseRouter:
def db_for_read(self, model, **hints):
'''You dont need to define Postgres model here since its in default database'''
if model is ModelMongo:
return "prueba"
return None
def db_for_write(self, model, **hints):
if model is ModelMongo:
return "prueba"
return None
def allow_relation(self, obj1, obj2, **hints):
'''Optional, but multidatabase relations are not really supported by django'''
if obj1._meta.model == ModelMongo and obj2._meta.model == ModelPostgres:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
'''Here you can get app label name or model name or hints from migrations files'''
if model_name == ModelMongo.__name__.lower():
return db == "prueba"
else:
return db == "default"
Так что это должно помочь с миграцией, так что у вас будут модели для mongo в базе данных mongo и другие в базе данных postgres. И при записи и чтении из баз данных, djongo будет знать, какую базу данных он должен использовать. И если вы разделили приложения для mongo и postgres, то вы также можете использовать метки приложений в вашей функции 'allow_migrate':
def allow_migrate(self, db, app_label, model_name=None, **hints):
'''If you have one app for mongo and one for postgres, then you can use app_label'''
if app_label == "mongo_app":
return db == "prueba"
else:
return db == "default"