首页 > 解决方案 > Django 错误:“settings.DATABASES 配置不正确。请提供 ENGINE 值。”

问题描述

我正在尝试按照此处的指南在 Django 2.2 中使用多个数据库,默认数据库留空。在我的 settings.py 文件中,我有

# Set database routers
DATABASE_ROUTERS = [r'myapp.db_routers.AuthRouter', r'myapp.db_routers.RemoteRouter']

# Database configuration - leave default blank
DATABASES = {
    'default': {},
    'auth_db': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'remote': {
        'ENGINE': 'sql_server.pyodbc',
        'HOST': 'MY HOST NAME',
        'NAME': 'MY DB NAME',
        'PORT': 'MY PORT NAME',
        'USER': get_secret(Secrets.REMOTE_DB_USERNAME),
        'PASSWORD': get_secret(Secrets.REMOTE_DB_PASSWORD),
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'host_is_server': True
        }
    }
}

我的 db_routers.py 文件然后包含两个数据库路由器,如文档中所建议的(但它应该捕获所有 django 内置应用程序):

class AuthRouter:
    route_app_labels = {"admin", "sessions", "messages", "staticfiles", "auth", "contenttypes"}

    def db_for_read(self,
                    model: Model,
                    **hints) -> Optional[str]:
        if model._meta.app_label in self.route_app_labels:
            return "auth_db"
        else:
            return None

    def db_for_write(self,
                     model: Model,
                     **hints) -> Optional[str]:
        if model._meta.app_label in self.route_app_labels:
            return "auth_db"
        else:
            return None

    def allow_relation(self,
                       model_1: Model,
                       model_2: Model,
                       **hints) -> Optional[bool]:
        if (model_1._meta.app_label in self.route_app_labels or
                model_2._meta.app_label in self.route_app_labels):
            return True
        else:
            return None

    def allow_migrate(self,
                      db: str,
                      app_label: str,
                      model_name: Optional[str] = None,
                      **hints) -> Optional[bool]:
        if app_label in self.route_app_labels:
            return db == "auth_db"
        else:
            return None


class RemoteRouter:

    remote_db = "remote"

    def db_for_read(self,
                    model: Model,
                    **hints) -> Optional[str]:
        # raise ValueError("read")
        return self.remote_db

    def db_for_write(self,
                     model: Model,
                     **hints) -> Optional[str]:
        # raise ValueError("write")
        return self.remote_db

    def allow_relation(self,
                       model_1: Model,
                       model_2: Model,
                       **hints) -> Optional[bool]:
        # raise ValueError("allow relations")
        if (model_1._state.db == self.remote_db or
                model_2._state.db == self.remote_db):
            return True
        else:
            return None

    def allow_migrate(self,
                      db: str,
                      app_label: str,
                      model_name: Optional[str] = None,
                      **hints) -> Optional[bool]:
        # print(f"allow migrate: {db}, {app_label}, {model_name}")
        return True

但是,当我运行 showmigrations 时,我收到错误“settings.DATABASES 配置不正确。请提供 ENGINE 值。”。根据文档,我尝试在我的第一个数据库路由器中仅使用“auth”和“contenttypes”,但这没有帮助。我还在这里查看了具有相同错误的其他问题,但我找不到与数据库路由器有相同问题的任何问题。

标签: pythondjango

解决方案


推荐阅读