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" 
Вернуться на верх