Django - создание настроек. Базы данных диктуют программно - PullRequest
1 голос
/ 26 февраля 2011

У меня есть сайт, который имеет около 7 дБ (специфичные для страны экземпляры сайта), и у меня есть много повторений в настройках DATABASES в настройках, поскольку на самом деле единственное, что меняется, - это ключ 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

Как я уже сказал, сгенерированный диктат неотличим от того, который я вводил вручную. Я не понимаю, почему это не сработает.

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Вы хотите 'NAME', а не 'name'.

1 голос
/ 26 февраля 2011

Приведенный ниже код предоставляет несколько различных способов задания настроек базы данных, включая разрешение старых объявлений Django 1.2-style 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...