0

好吧,我有一个 django 项目现在运行良好。

我想向其中添加一个新应用程序,我需要在其中访问多个数据库。

我知道 Django 支持多个数据库设置并且知道如何配置它。这不是问题。

问题是,在我 90% 的项目组件中,我不需要维护多个数据库设置。第二个数据库的唯一用途是在新添加的应用程序中。

所以我试图通过调用来改变设置:

django.conf.settings.configure(DATABASES = {....})

在新的应用程序中。django 说:

RuntimeError: Settings already configured.

这是有道理的,因为我有原始设置文件并设置了 DJANGO_SETTINGS_MODULE。

所以我的问题是在这种情况下应该是一个好的方法。

  1. 我不想丢弃 DJANGO_SETTINGS_MODULE 变量。
  2. 我最初尝试不在设置文件中包含第二个数据库,因为新应用程序也是一个独立模块,应该在 django 项目之外独立工作。所以我想在新应用程序中使用类似的配置来设置数据库配置。

有人对此有任何想法吗?

提前致谢!

4

1 回答 1

2

实际上,我在当前项目中遇到了同样的问题。正如您一样,我有一个完全独立的应用程序,它使用另一个数据库,并且我可以拥有其他可能具有相同行为的应用程序。

我所做的是创建一个目录应用程序来存储我的应用程序,然后将其添加到我的 settings.py 文件的末尾:

DATABASE_ROUTERS = ['myproject.routers.MultiDBRouter']
import os
APPS_DIR = os.path.join(PROJECT_ROOT, 'apps')
for app_name in os.listdir(APPS_DIR):
  print '\nLooking for settings in apps/%s :' % app_name
  if os.path.exists(os.path.join(APPS_DIR, app_name, 'settings.py')):
    print '  Settings file found...'
    app = __import__('%s.settings' % app_name)

    content = dir(app.settings)
    if 'DATABASES' in content:
      print '  Adding databases :'
      for key, value in app.settings.DATABASES.iteritems():
        if DATABASES.has_key(key):
          print '    Can not add %s database config, because it already exists' % key
        else:
          DATABASES[key] = value
          DATABASES[key]['APPS'] = [app_name]
          print '    Added %s database config' % key

它会自动查看所有 apps/myapp/ 目录中的 settings.py 文件。如果它在 app/myapp/settings.py 文件中找到一个新的 DATABASES 变量,它会将其他数据库配置添加到您的 DATABASES 变量(真正的那个)。

我还创建了一个不必使用 using 命令(MultiDBRouter)的路由器。

然后我在所有需要另一个数据库的应用程序中添加一个 settings.py 文件:

DATABASES = {
  'db': {
     'ENGINE': 'django.db.backends.mysql',
     'NAME': 'database',
     'USER': 'username',
     'PASSWORD': 'mysecretpassword',
   }
 }
于 2013-07-17T14:35:38.027 回答