2011-02-25 3 views
1

나는 약 7 dbs (국가 별 사이트 인스턴스)의 사이트를 가지고 있으며 실제로 설정을 변경하면 DATABASES DICT에 많은 반복이 있습니다. 각 항목에 대한 DATABASE 키Django - building settings.DATABASES dict programatically

그래서 설정에서 동적으로 사전을 만들고 싶었습니다. 내 코드는 잘 작동하고 내가 전에 수동으로 입력 한 것과 동일한 DICT를 구축,하지만 난 그것을 실행하려고하면 어떤 이유로이 오류를 얻을 : 여기

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

내가를 생성하는 설정에서 사용하고 코드입니다 dict :

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 

내가 말한대로 생성 된 dict은 수동으로 입력 한 dict와 구별 할 수 없습니다. 왜이게 효과가 없을지 모르겠지만 ... 어떤 생각?

imanc 당신은 'NAME'하지 'name' 원하는

답변

1

아래 코드는 이전, 장고 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

.

+0

아아 ! 나는 그게 맞을 것이라고 내기 ... – user307927

+0

즉각적인 문제는 해결하지만 하드 코드 된 'NAME','ENGINE','USER' 및'PASSWORD' 이외의 변수에는 도움이되지 않습니다. –