2012-10-01 11 views
6

Debo extraer datos de una base de datos de Oracle. ¿Cómo puedo averiguar qué esquema está definido en la base de datos? Cuando no defino ningún esquema en la descripción de Metadata(), no encuentro tablas. gracias por su ayuda,esquema sqlalchemy oracle

+1

O tal vez debería preguntar primero, ¿es posible hacer tal cosa? – user1711699

Respuesta

9

El esquema predeterminado de Oracle coincide con el nombre de usuario que se utilizó en la conexión Oracle. Si no ve ninguna tabla, significa que las tablas se crean en otro esquema.

Parece que usted tiene aquí dos cuestiones:

1) Acerca de los esquemas de Oracle - cómo encontrar esquema y las tablas en Oracle

2) sobre reflexiones SQLAlchemy - cómo especificar esquema de Oracle para la tabla

Puede encontrar la respuesta a la primera pregunta en muchos lugares. Es decir. aquí: https://stackoverflow.com/a/2247758/1296661

Responder a la segunda pregunta: Tabla constructor de la clase tiene argumento esquema para especificar el esquema de tabla si es diferente del esquema de usuario por defecto. Vea más aquí http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#sqlalchemy.schema.Table

Aquí está el código python para responder la segunda pregunta. Tendrá que los valores de configuración de conexión db y nombre de la tabla para que coincida con su 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 

Buena suerte con el uso y función SQLSchema reflexión - es un montón de diversión. Consigues que tu programa python trabaje con la base de datos existente casi sin definir la información del esquema en tu programa.

Estoy usando esta característica con Oracle DB en producción; lo único que tengo que definir son las relaciones entre las tablas que establecen explícitamente las claves externas y las principales.

+0

Gracias por su respuesta. Pero como puedo entender, no es posible obtener una lista de todos los esquemas de la base de datos sin ser el administrador de la base de datos. – user1711699

+0

Generalmente no hay necesidad de ser administrador para obtener permisos para listar tablas y esquemas en Oracle. Depende de qué permisos tenga la cuenta de usuario, pero normalmente existen tales permisos. Intente ejecutar esta consulta: SELECT PROPIETARIO, count (*) table_count FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' GROUP BY PROPIETARIO; – vvladymyrov

+0

Gracias de nuevo. ¿Cómo puedo hacer esto en SQLAlchemy? ¿Cómo puedo consultar toda la base de datos? ¿Cuál es el equivalente de 'all_objects' en sqlalchemy? – user1711699

Cuestiones relacionadas