1

cx_oracle をインストールし、inspectdb を実行しました。出力が得られないようですか?誰か助けてくれませんか?Oracle で inspectdb を使用する際に既知の問題はありますか?

以下はコマンドとsettings.pyです。

python manage.py inspectdb --database xxx_db

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#     * Rearrange models' order
#     * Make sure each model has one field with primary_key=True
# Feel free to rename the models, but don't rename db_table values or field names.
#
# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'
# into your database.

from django.db import models

設定.py

DATABASES = {
    'xxx_db': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'abc',
        'USER': 'abc_read',
        'PASSWORD': 'abc_read',
        'HOST': 'apps.domain.com',
        'PORT': 'xxxx'
        },
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'aaaa',
        'USER': 'aaaa',
        'PASSWORD': 'xxxx',
        'HOST': '/tmp/mysql.sock',
        'PORT': ''
        }
}
4

5 に答える 5

1

2つのこと:

  1. Inspectdb は公式には oracle をサポートしていません ( Django Docs - inspectdbを参照)。
  2. Django は Oracle スキーマをあまり強力にサポートしていません (未解決の Django チケット 6148を参照)。そのため、スキーマのメイン ユーザーを使用して接続でき、スキーマをデフォルト スキーマのイントロスペクトにすることができれば、うまくいくかもしれません。

introspection.py の選択を変更することで、基本的なモデル ファイルの出力を取得できました。私にとっては、django/db/backends/oracle/introspection.py (40 行目あたり) の get_table_list 関数を次のように変更しました。

def get_table_list(self, cursor):
    "Returns a list of table names in the current database."
    cursor.execute("SELECT TABLE_NAME FROM USER_TABLES")
    return [row[0].lower() for row in cursor.fetchall()]

def get_table_list(self, cursor):
    "Returns a list of table names in the current database."
    cursor.execute("SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'SCHEMA_TO_QUERY'")
    return [row[0].lower() for row in cursor.fetchall()]

しかし、Oracle のスキーマに対するサポートが全体的に貧弱であると読んだときに、django をあきらめました。

于 2012-02-20T20:51:04.180 に答える
0

わたしにはできる。

ユーザーが Oracle のすべてのテーブルを表示する権限を持っていることを確認しましたか?

とにかく、inspectdb で使用されている SQL について知りたいです。

于 2011-06-17T16:39:55.547 に答える
0

@Pleceboは正しい軌道に乗っています。get_table_list メソッドが問題の原因ですが、指定された Select ステートメントは機能しませんでした。

必要なものをすばやく取得するために、一時的にテーブル名をハードコーディングしました。

(django/db/backends/oracle/introspection.py 行 40)

def get_table_list(self, cursor):
    "Returns a list of table names in the current database."
    #cursor.execute("SELECT TABLE_NAME FROM USER_TABLES")
    return ['table_name1', 'table_name2']
    #return [row[0].lower() for row in cursor.fetchall()]
于 2012-07-09T20:34:09.730 に答える
-1

Haaaa.. この問題に直面しただけで、ばかげた理由が見つかりました!!

投稿の 1 つで行われたように、下位層のファイルを編集する必要はありません。そのデータベースにテーブルがない場合、この問題に直面します。ふふふ..

Create a few tables and then try. それは魅力のように機能します。

于 2012-04-19T20:02:19.107 に答える