2012-10-01 11 views
6

Ich sollte Daten aus einer Oracle-Datenbank extrahieren. Wie kann ich herausfinden, welches Schema in der Datenbank definiert ist? Wenn ich in der Beschreibung von Metadata() kein Schema definiere, finde ich keine Tabellen. danke für Ihre Hilfe,sqlalchemy Orakel Schema

+1

Oder vielleicht sollte ich zuerst fragen, ist es möglich, so etwas zu tun? – user1711699

Antwort

9

Standard-Oracle-Schema entspricht der Benutzername, der in Oracle-Verbindung verwendet wurde. Wenn Sie keine Tabellen sehen, bedeutet dies, dass die Tabellen in einem anderen Schema erstellt werden.

Sieht aus wie Sie zwei Fragen hier:

1) über Oracle-Schemata - wie Schema und Tabellen in Oracle finden

2) über SQLAlchemy Reflexionen - wie Oracle-Schema für die Tabelle angeben

Sie finden die Antwort für die erste Frage an vielen Stellen. I.e. hier: https://stackoverflow.com/a/2247758/1296661

Beantworten der zweiten Frage: Tabellenklassenkonstruktor verfügt über ein Schemaargument zum Angeben des Tabellenschemas, wenn es sich vom Standardbenutzerschema unterscheidet. Sehen Sie mehr hier http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#sqlalchemy.schema.Table

Hier ist der Python-Code, um die zweite Frage zu beantworten. Sie werden auf Setup DB-Verbindung und Tabellennamen Werte müssen Ihren Fall entsprechen:

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 

Viel Glück bei der Verwendung von SQLSchema und Reflexion Merkmale - es ist eine Menge Spaß. Sie erhalten Ihr Python-Programm mit der vorhandenen Datenbank fast ohne Definieren von Schemainformationen in Ihrem Programm.

Ich verwende diese Funktion mit Oracle-DB in der Produktion - das einzige, was ich definieren musste, waren Beziehungen zwischen Tabellen, die explizit Fremd- und Primärschlüssel setzen.

+0

Vielen Dank für Ihre Antwort. Aber wie ich verstehen kann, ist es nicht möglich, eine Liste aller Schemata von der Datenbank zu bekommen, ohne der Datenbankadministrator zu sein. – user1711699

+0

Normalerweise ist es nicht erforderlich, Administrator zu sein, um Berechtigungen für das Auflisten von Tabellen und Schemas in Oracle zu erhalten. Es hängt davon ab, welche Berechtigungen Benutzerkonto hat, aber normalerweise gibt es solche Berechtigungen. Versuchen Sie, diese Abfrage auszuführen: SELECT OWNER, count (*) table_count VON ALL_OBJECTS WHERE OBJECT_TYPE = 'TABELLE' GROUP BY Besitzer; – vvladymyrov

+0

Nochmals vielen Dank. Wie kann ich dies in SQLAlchemy tun? Wie kann ich die gesamte Datenbank abfragen? Was entspricht "all_objects" in sqlalchemy? – user1711699