0

複数のデータベースにある 1 つのデータベース テーブルにアクセスしようとしています。

最初に 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()

その後、問題なく動作します。では、どうすればこれを動的に行うことができますか?

アラン

4

1 に答える 1

0

Django では、使用するデータベースを決定するために DB ルーターを定義する必要があります。おそらく、あなたの定義は正しいものではありません。

于 2012-04-11T17:57:31.983 に答える