Я пытаюсь получить доступ к одной таблице базы данных, которая находится в нескольких базах данных.
Сначала я попытался использовать 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()
, тогда все будет работать нормально.Так как я могу сделать это динамически?
Алан