Python 如何在django中对多个mysql模式使用inspectdb?

Python 如何在django中对多个mysql模式使用inspectdb?,python,mysql,django,database,Python,Mysql,Django,Database,这是my Settings.py中的数据库词典 我的数据库有多个模式,例如帐户、登录、通知等。 当我执行python manage.py inspectdb时,我只获取帐户模式中表的类,但我希望所有模式的类。 我尝试过使用python manage.py inspectdb-database=login,但遇到了django.db.utils.ConnectionDoesNotExist异常 但是,如果我将设置更改为 DATABASES = { 'default': {

这是my Settings.py中的数据库词典

我的数据库有多个模式,例如帐户、登录、通知等。 当我执行python manage.py inspectdb时,我只获取帐户模式中表的类,但我希望所有模式的类。 我尝试过使用python manage.py inspectdb-database=login,但遇到了django.db.utils.ConnectionDoesNotExist异常

但是,如果我将设置更改为

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'account',
        'USER': 'xxxx',
        'PASSWORD': 'xxxx',
        'HOST': 'localhost',
        'PORT': '3306'
    },
    'login': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'login',
        'USER': 'xxxx',
        'PASSWORD': 'xxxx',
        'HOST': 'localhost',
        'PORT': '3306'
    },
}
我在执行python manage.py inspectdb-database=login时获得表login的适当类。但是,问题是,如果这应该是一个过程,我必须在DATABASES选项中做一个选项,它将变得非常长,因为我有超过15个模式,我不确定这样做是否是一件好事

所以,我想知道做这件事的正确方法是什么


我使用的是Django 1.10.5。

Django需要知道如何访问您的每个数据库,这样您就无法避免在数据库设置中声明它们。如果您唯一担心的是会失去可读性,那么可以创建一个helper函数来消除重复

例如:

def local_db(name):
    return {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': name,
        'USER': 'xxxx',
        'PASSWORD': 'xxxx',
        'HOST': 'localhost',
        'PORT': '3306',
    }

DATABASES = {
    'default': local_db('account'),
    'login': local_db('login'),
    # Etc.
}
from django.conf import settings
from django.core.management.commands.inspectdb import Command as BaseCommand


class Command(BaseCommand):
    def handle(self, **options):
        for db_name in settings.DATABASES:
            options['database'] = db_name
            self.stdout.write('# Generated while inspecting database %s\n' % db_name)
            super().handle(**options)
如果要同时检查所有数据库,可以创建一个自定义命令

例如:

def local_db(name):
    return {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': name,
        'USER': 'xxxx',
        'PASSWORD': 'xxxx',
        'HOST': 'localhost',
        'PORT': '3306',
    }

DATABASES = {
    'default': local_db('account'),
    'login': local_db('login'),
    # Etc.
}
from django.conf import settings
from django.core.management.commands.inspectdb import Command as BaseCommand


class Command(BaseCommand):
    def handle(self, **options):
        for db_name in settings.DATABASES:
            options['database'] = db_name
            self.stdout.write('# Generated while inspecting database %s\n' % db_name)
            super().handle(**options)

为什么不把所有的表放在一个数据库中?@aumo我不能。这是一个遗留数据库或实时应用程序,我无法更改数据库中的任何内容。我主要担心的是,当我这样做时,我无法获得登录数据库中表的所有模型类。即使您指定了-database选项,我也只会在inspectdb上执行时获取默认db表的模型类?如果我指定了-database,那么只会出现指定的数据库。那么,我是否必须为所有数据库指定它?是的,您必须为每个数据库运行该命令。您可以创建一个自定义命令,该命令将遍历数据库并在每个数据库上运行inspectdb。您可以使用>>models.py附加到模型文件,而不是覆盖它。自定义命令解决方案也可以工作。