2011-02-25 18 views
1

我有一个网站有大约7 dbs(国家特定的网站实例),我有很多重复的DATABASES字典设置,因为真正唯一的变化是DATABASE键,用于每个条目。Django - 建立settings.DATABASES字典编程

所以我想在设置中动态构建字典。我的代码工作正常,并建立,因为我曾手动之前输入了相同的字典,但由于某些原因,当我尝试运行它,我得到这个错误:

_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 

正如我所说的生成的字典是无法区分我手动输入的字典。我不明白为什么这不起作用......有什么想法?

imanc

回答

1

下面的代码提供指定数据库设置,包括允许老,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 
3

你想'NAME',不'name'

+0

哎呀!我敢打赌,这是... – user307927 2011-02-25 21:39:12

+0

这解决了即时问题,但对硬编码的'NAME','ENGINE','USER'和'PASSWORD'以外的其他变量没有帮助。 – 2011-02-25 22:02:15