如何在django中使用inspectdb进行多个mysql架构?

时间:2017-01-24 11:12:30

标签: python mysql django database

这是我Settings.py

中的DATABASES字典
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'account',
        'USER': 'xxxx',
        'PASSWORD': 'xxxx',
        'HOST': 'localhost',
        'PORT': '3306'
    }
}

我的数据库有多个模式,例如帐户,登录,通知等。 当我做一个python manage.py inspectdb时,我只得到" account"中的表的类。 schema,但我想要所有模式的类。 我尝试了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时获得了正确的表登录类。但是,问题是,如果这应该是程序,我必须在DATABASES选项中做一个选项,这将变得非常长,因为我有超过15个模式,我不确定是否正在做这将是一件好事。

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

我在Django 1.10.5上。

1 个答案:

答案 0 :(得分:1)

Django需要知道如何访问每个数据库,这样您就无法避免在DATABASES设置中声明它们。如果你唯一担心的是你的可读性会降低,你可以创建一个辅助函数来摆脱重复。

例如:

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)