Django не может получить данные, используя несколько баз данных - PullRequest
0 голосов
/ 26 сентября 2011

Я пытаюсь получить доступ к одной таблице базы данных, которая находится в нескольких базах данных.

Сначала я попытался использовать MytableObject.get.using (databasename), но он выдал ошибку:

django.db.utils.DatabaseError: relation "mytable" does not exist

Итакя решил выяснить почему.До тех пор, пока я знаю, что я не делаю ничего, кроме обычного:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': config.get('databaseDefault', 'DATABASE_NAME'),                      # Or path to database file if using sqlite3.
        'USER': config.get('databaseDefault', 'DATABASE_USER'),                      # Not used with sqlite3.
        'PASSWORD': config.get('databaseDefault', 'DATABASE_PASSWORD'),                  # Not used with sqlite3.
        'HOST': config.get('databaseDefault', 'DATABASE_HOST'),                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': config.get('databaseDefault', 'DATABASE_PORT'),                      # Set to empty string for default. Not used with sqlite3.
    }, 
    'databaseEe': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': config.get('databaseEe', 'DATABASE_NAME'),                      # Or path to database file if using sqlite3.
        'USER': config.get('databaseEe', 'DATABASE_USER'),                      # Not used with sqlite3.
        'PASSWORD': config.get('databaseEe', 'DATABASE_PASSWORD'),                  # Not used with sqlite3.
        'HOST': config.get('databaseEe', 'DATABASE_HOST'),                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': config.get('databaseEe', 'DATABASE_PORT'),                      # Set to empty string for default. Not used with sqlite3.
    },
    'databaseLv': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': config.get('databaseLv', 'DATABASE_NAME'),                      # Or path to database file if using sqlite3.
        'USER': config.get('databaseLv', 'DATABASE_USER'),                      # Not used with sqlite3.
        'PASSWORD': config.get('databaseLv', 'DATABASE_PASSWORD'),                  # Not used with sqlite3.
        'HOST': config.get('databaseLv', 'DATABASE_HOST'),                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': config.get('databaseLt', 'DATABASE_PORT'),                      # Set to empty string for default. Not used with sqlite3.
    },
    'databaseLt': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': config.get('databaseLt', 'DATABASE_NAME'),                      # Or path to database file if using sqlite3.
        'USER': config.get('databaseLt', 'DATABASE_USER'),                      # Not used with sqlite3.
        'PASSWORD': config.get('databaseLt', 'DATABASE_PASSWORD'),                  # Not used with sqlite3.
        'HOST': config.get('databaseLt', 'DATABASE_HOST'),                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': config.get('databaseLt', 'DATABASE_PORT'),                      # Set to empty string for default. Not used with sqlite3.
    }                    
}

И я создал некоторый тест-код:

from django.db import connections
cursor = connections[database].cursor()
cursor.execute("select tablename from pg_tables WHERE tablename !~* 'pg_*'")
print cursor.fetchall()

, который распечатал все мои имена таблиц, "mytable" среди них.

Тогда я попробовал этот код:

from django.db import connections
cursor = connections[database].cursor()
cursor.execute("select * from mytable")
print cursor.fetchall()

, который снова выдал ошибку:

django.db.utils.DatabaseError: relation "mytable" does not exist
LINE 1: select * from mytable

Так, что я делаю не так?я могу читать и писать в базу данных по умолчанию просто отлично.Я отследил все до этой строки:

cursor = connections[database].cursor()

и обнаружил, что, если я напишу реальное имя соединения вместо базы данных, например:

cursor = connections['databaseLv'].cursor()

, тогда все будет работать нормально.Так как я могу сделать это динамически?

Алан

1 Ответ

0 голосов
/ 11 апреля 2012

Django необходимо определить маршрутизаторы БД, чтобы решить, какую базу данных использовать, возможно, ваши определения не верны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...