7

Oracle データベースからデータを抽出する必要があります。データベースで定義されているスキーマを確認するにはどうすればよいですか? Metadata() の記述でスキーマを定義しないと、テーブルが見つかりません。ご協力いただきありがとうございます、

4

2 に答える 2

13

デフォルトの Oracle スキーマは、Oracle 接続で使用されたユーザー名と一致します。テーブルが表示されない場合は、テーブルが別のスキーマで作成されていることを意味します。

ここで 2 つの質問があるようです。

1) Oracle スキーマについて - Oracle でスキーマとテーブルを検索する方法

2) SQLAlchemy リフレクションについて - テーブルに Oracle スキーマを指定する方法

最初の質問に対する答えは、さまざまな場所で見つけることができます。すなわちここ:https://stackoverflow.com/a/2247758/1296661

2 番目の質問への回答: テーブル クラス コンストラクターには、テーブルのスキーマが既定のユーザーのスキーマと異なる場合にそれを指定するスキーマ引数があります。ここで詳細を参照してください http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#sqlalchemy.schema.Table

2 番目の質問に答える Python コードを次に示します。ケースに合わせてデータベース接続とテーブル名の値を設定する必要があります。

from sqlalchemy import Table
from sqlalchemy.ext.declarative import declarative_base


from sqlalchemy import create_engine
engine = create_engine('oracle://<user_name>:<password>@<hostname>:1521/<instance name>', echo=True)
Base = declarative_base()

reflected_table = Table('<Table name>', 
    Base.metadata, 
    autoload=True, 
    autoload_with=engine, 
    schema='<Schema name other then user_name>')
print [c.name for c in reflected_table.columns]

p = engine.execute("SELECT OWNER,count(*) table_count FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' GROUP BY OWNER");

for r in p:
    print r

sqlschema とリフレクション機能を使用して頑張ってください。とても楽しいです。プログラムでスキーマ情報をほとんど定義せずに、Python プログラムを既存のデータベースで動作させることができます。

私は本番環境で oracle db でこの機能を使用しています。定義する必要があるのは、外部キーと主キーを明示的に設定するテーブル間の関係だけでした。

于 2012-10-03T15:45:22.940 に答える