【问题标题】:How to use inspectdb for multiple mysql schemas in django?如何在 django 中对多个 mysql 模式使用 inspectdb?
【发布时间】:2017-01-24 11:12:29
【问题描述】:

这是我Settings.py中的DATABASES字典

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

我的数据库有多个模式,例如,帐户、登录、通知等。 当我执行 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 时获得了正确的表登录类。但是,问题是,如果这应该是程序,我必须在DATABASES 选项中做出一个选项,这将变得非常长,因为我有超过 15 个模式,我不确定这样做是否会是不是一件好事。

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

我在 Django 1.10.5 上。

【问题讨论】:

  • 为什么不将所有表放在一个数据库中?
  • @aumo 我不能。它是旧数据库或实时应用程序,我无法更改数据库中的任何内容。

标签: python mysql django database


【解决方案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)

【讨论】:

  • 我主要担心的是,当我这样做时,我无法获取login db 中表的所有模型类。我只在inspectdb上执行时获得default db 的表的模型类@
  • 即使您指定了--database 选项?
  • 如果我指定--database,那么只有指定的数据库来了。那么,是不是我必须为我的所有数据库指定它?
  • 是的,您必须为每个数据库运行该命令。您可以创建一个自定义命令,该命令将遍历数据库并在每个数据库上运行 inspectdb
  • 您可以使用>> models.py 附加到模型文件而不是覆盖它。自定义命令解决方案也可以。
猜你喜欢
  • 2016-10-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多