2012-10-01 10 views
6

Devo estrarre i dati da un database Oracle. Come posso sapere quale schema è definito nel database? Quando non definisco nessuno schema nella descrizione di Metadata(), non trovo tabelle. grazie per il vostro aiuto,sqlalchemy oracle scheme

+1

O forse dovrei prima chiedere, è possibile fare una cosa del genere? – user1711699

risposta

9

Lo schema Oracle predefinito corrisponde al nome utente utilizzato nella connessione Oracle. Se non vedi alcuna tabella, significa che le tabelle vengono create in un altro schema.

Sembra che tu abbia due domande qui:

1) sugli schemi Oracle - come trovare schemi e tabelle in Oracle

2) su riflessioni SQLAlchemy - come specificare schema Oracle per la tavola

Puoi trovare la risposta per la prima domanda in molti posti. Cioè qui: https://stackoverflow.com/a/2247758/1296661

Risposta alla seconda domanda: Il costruttore della classe Tabella ha un argomento schema per specificare lo schema della tabella se è diverso dallo schema dell'utente predefinito. Ulteriori informazioni qui http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#sqlalchemy.schema.Table

Ecco il codice Python per rispondere alla seconda domanda. Avrete bisogno di valori Impostazione connessione db e nome tabella per abbinare il vostro caso:

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 

Buona fortuna con l'utilizzo SQLSchema e funzione di riflessione - si tratta di un sacco di divertimento. Ottieni il tuo programma python lavorando con il database esistente quasi senza definire le informazioni sullo schema nel tuo programma.

Utilizzo questa funzione con oracle db in produzione: l'unica cosa che devo definire sono le relazioni tra tabelle che impostano esplicitamente le chiavi esterne e primarie.

+0

Grazie per la risposta. Ma come posso capire, non è possibile ottenere un elenco di tutti gli schemi dal database senza essere l'amministratore del database. – user1711699

+0

Di solito non è necessario essere amministratori per ottenere le autorizzazioni per l'elenco di tabelle e schemi in Oracle. Dipende da quali autorizzazioni ha l'account utente, ma normalmente ci sono tali permessi. Prova a eseguire questa query: SELEZIONA TITOLARE, conta (*) table_count DA ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' GROUP BY OWNER; – vvladymyrov

+0

Grazie ancora. Come posso farlo in SQLAlchemy? Come posso interrogare l'intero database? Qual è l'equivalente di "all_objects" in sqlalchemy? – user1711699