2012-10-01 5 views
6

Oracleデータベースからデータを抽出する必要があります。 データベースに定義されているスキーマはどのようにして調べることができますか? Metadata()の説明にスキーマを定義していないときは、テーブルが見つかりません。 ご協力ありがとうございます。sqlalchemy Oracleスキーム

+1

おそらく私は最初に尋ねるべきです、そういうことをすることは可能でしょうか? – user1711699

答えて

9

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

あなたがここに二つの質問持っているように見える:

1)Oracleのスキーマについてを - SQLAlchemyの反射について)オラクル

2のスキーマとテーブルを見つける方法 - Oracleスキーマを指定する方法をテーブルのため

最初の質問の回答は、多くの場所で見つけることができます。私。ここでは、https://stackoverflow.com/a/2247758/1296661

第2質問 テーブルクラスのコンストラクタは、デフォルトのユーザのスキーマと異なる場合、テーブルのスキーマを指定するスキーマ引数を持ちます。ここをクリックしてください http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#sqlalchemy.schema.Table

次は第2の質問に答えるためのPythonコードです。あなたは、あなたのケースに一致するように設定DB接続とテーブル名の値にする必要があります:sqlschemaと反射機能を使用して

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 

幸運 - それは多くの楽しみです。あなたのプログラムにスキーマ情報をほとんど定義することなく、あなたのPythonプログラムを既存のデータベースで動作させることができます。

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

+0

ありがとうございます。しかし、理解できるように、データベース管理者でなくても、データベースからすべてのスキーマのリストを取得することはできません。 – user1711699

+0

通常、oracleのテーブルとスキーマをリストする権限を取得するには、管理者の必要はありません。ユーザーアカウントにはどのような権限があるかによって異なりますが、通常はそのような権限があります。次のクエリを実行してみてください。 SELECT OWNER、count(*)table_count FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' GROUP BY OWNER; – vvladymyrov

+0

もう一度ありがとうございます。 SQLAlchemyでこれをどうやって行うことができますか?データベース全体をどのようにクエリできますか? sqlalchemyの 'all_objects'に相当するものは何ですか? – user1711699