【问题标题】:Django - building settings.DATABASES dict programmaticallyDjango - 以编程方式构建 settings.DATABASES dict
【发布时间】:2011-02-25 21:31:29
【问题描述】:

我有一个大约有 7 个数据库的站点(该站点的国家特定实例),并且我在设置中的 DATABASES dict 中有很多重复,因为实际上唯一改变的是每个条目的 DATABASE 键。

所以我想在设置中动态构建字典。我的代码工作正常,并构建了与我之前手动输入的相同的 dict,但由于某种原因,当我尝试运行它时出现此错误:

_mysql_exceptions.OperationalError: (1046, 'No database selected')

这是我在设置中用来生成字典的代码:

DATABASES = {}

for d in DBS:
    #SITE_INSTANCE, e.g. 'dev' and DBS is a list of db names
    name = '%s_%s' % (SITE_INSTANCE, d)   

    if not DATABASES:   #first item - set up 'default'
        d = 'default'
    DATABASES[d] = {}       
    DATABASES[d]['name'] = name
    DATABASES[d]['ENGINE'] = DB_ENGINE    
    DATABASES[d]['USER'] = DB_USERNAME
    DATABASES[d]['PASSWORD'] = DB_PASSWORD

正如我所说,生成的字典与我手动输入的字典没有区别。我不明白为什么这不起作用。

【问题讨论】:

    标签: django settings


    【解决方案1】:

    你想要'NAME',而不是'name'

    【讨论】:

    • 这解决了眼前的问题,但对硬编码的NAMEENGINEUSERPASSWORD 以外的变量没有帮助。
    【解决方案2】:

    以下代码提供了几种指定数据库设置的不同方法,包括允许旧的 Django 1.2 风格的 DATABASE_FOO 声明:

    # Settings with no underscores in their names apply to the "default"
    # database out-of-the-box
    DATABASE_ENGINE = 'sqlite3'
    DATABASE_NAME = 'foo.sqlite'
    DATABASE_USER = ''
    DATABASE_PASSWORD = ''
    DATABASE_HOST = ''
    DATABASE_PORT = ''
    
    # Since this setting has underscores in it, it needs to be specified the
    # long way to disambiguate
    DATABASE_default_SUPPORTS_TRANSACTIONS = True
    
    # Specifying any settings for a database will implicitly copy everything
    # else from default.
    DATABASE_baz_NAME = 'baz.sqlite'
    
    # Databases can also be defined with Django 1.2-style dicts
    DATABASE_bar = {
        'NAME': 'bar.sqlite',
    }
    
    # Empty dicts will create complete clones of default
    DATABASE_clone = {}
    

    ...这是实现:

    databases = {}
    database_global_settings = set([
        'DATABASE_ROUTERS',
    ])
    current_settings = globals()
    for (k, v) in current_settings.items():
        if k in database_global_settings:
            continue
        if k.startswith('DATABASE_'):
            if k.count('_') >= 2:
                (dummy_label, dbname, variable) = k.split('_', 2)
                if not dbname in databases:
                    databases[dbname] = {}
                databases[dbname][variable] = v
            elif isinstance(v, dict):
                (dummy_label, dbname) = k.split('_', 1)
                if dbname in databases:
                    databases[dbname].update(v)
                else:
                    databases[dbname] = v
            else:
                # legacy configuration for default database
                dbname = 'default'
                (dummy_label, variable) = k.split('_', 1)
                if not dbname in databases:
                    databases[dbname] = {}
                databases[dbname][variable] = v
            del globals()[k]
    for database_name in databases:
        if database_name != 'default':
            for (k, v) in databases['default'].iteritems():
                databases[database_name].setdefault(k, v)
    DATABASES = databases
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2014-09-26
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2015-03-03
      • 1970-01-01
      相关资源
      最近更新 更多