2011-09-26 60 views
0

我試圖訪問一個數據庫中的數據庫表。Django無法使用多個數據庫檢索數據

我嘗試使用MytableObject.get.using(數據庫名稱)第一,但它扔錯誤:

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. 
    }      
} 

,我開了一些testcode:

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() 

然後它工作得很好。那麼我該如何動態地做到這一點?

艾倫

回答

0

Django的需要DB路由器被定義來決定使用什麼數據庫,也許你的定義是不正確的。