5

Oracle データベースに対してinspectdbを実行したいと考えています。私が使用するユーザー アカウントは、0 テーブルを所有する読み取り専用ユーザーです。ただし、すべてのテーブルを含むスキーマにアクセスできます。を使用するときにスキーマを指定するにはどうすればよいinspectdbですか?

現在、私のコマンドは次のとおりです。python manage.py inspectdb --database "oradb" > test_model.py

これは、 を持つファイルのみを出力しますfrom django.db import models

4

5 に答える 5

4

Césarの答えは、Oracleのサポートに関して真実です。django\db\backends\oracle\introspection.pyしかし、 2箇所修正することで大まかなモデルを生成することができました。

cursor.executeの行を次のように変更get_table_listします。

cursor.execute("SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'OTHERSCHEMA'")

の最初の行のuser_table_colstoを次のように変更します。 ALL_TAB_COLUMNScursor.executeget_table_description

cursor.execute("""
        SELECT
            column_name,
            data_default,
            CASE
                WHEN char_used IS NULL THEN data_length
                ELSE char_length
            END as internal_size
        FROM ALL_TAB_COLUMNS
        WHERE table_name = UPPER(%s)""", [table_name])

次に、2cursor.execute行目を次のように変更get_table_descriptionします。cursor.execute("SELECT * FROM OTHERSCHEMA.%s WHERE ROWNUM < 2" % self.connection.ops.quote_name(table_name))

これは、ポリシーによってデータベースへの変更が禁止されているレガシー データベースであるため、1 回限りの実行には適していました。

モデルが完成したら、さらにいくつかの変更が必要です。いくつかのクラスで、主キー参照と外部キー参照が欠落しているようです。これらを手動で追加します。

私が行った最後の変更はclass Meta:、正しいスキーマを参照するようにすべてのインスタンスを変更することでした:

class Meta:
    db_table = u'"SCHEMA"."TABLE_NAME"'     # Notice the quoting needed
于 2012-08-06T19:17:20.317 に答える
1

問題は、Django のinspectdbが Oracle をサポートしていないことです。ドキュメントから:

inspectdb は、PostgreSQL、MySQL、および SQLite で動作します。外部キー検出は、PostgreSQL および特定のタイプの MySQL テーブルでのみ機能します。

--database オプションを使用して、イントロスペクトするデータベースを指定できます。

于 2012-08-06T17:27:10.963 に答える
-1

次のように、settings.py の DATABASES 変数にオプションを追加して、search_path を指定してみてください。

'OPTIONS': {
       'options': '-c search_path=myschema'
}

完全な DATABASES 変数は次のようになります。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mydatabase',
        'USER': 'postgres',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
        'OPTIONS': {
            'options': '-c search_path=myschema'
        }
    }
}

その後python migrate inspectdb、スキーマで動作するはずです

于 2016-02-05T15:04:29.543 に答える