2010-01-06 11 views
5

Bueno, espero que esto no sea un duplicado, la búsqueda no produjo nada útil.Cambiando el esquema usando cx_Oracle

He estado jugando con cx_Oracle durante los últimos días, instalándolo y usándolo. Todo fue bien hasta que llegué a mi problema actual: me gustaría cambiar mi esquema. Si estuviera usando sqlplus, un simple 'alter session set current_schema = toto;' haría, pero no sé cómo evitarlo con cx_Oracle.

He descargado la última versión de la fuente: cx_Oracle-5.0.2.tar.gz.

De acuerdo con la documentation cambio de esquema es un simple caso de la configuración Connection.current_schema que debe ser un atributo de lectura-escritura ... el problema es mi objetivo Connection no tiene ningún atributo current_schema.

>>> c = cx_Oracle.connect(...) 
>>> dir(c) 
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
'__subclasshook__', 'autocommit', 'begin', 'cancel', 'changepassword', 'close', 
'commit', 'cursor', 'dsn', 'encoding', 'inputtypehandler', 
'maxBytesPerCharacter', 'nencoding', 'outputtypehandler', 'password', 'prepare', 
'register', 'rollback', 'stmtcachesize', 'tnsentry', 'unregister', 'username', 
'version'] 

Tratar de establecer el atributo mediante

>>> c.current_schema = 'toto' 

resultados en un error ... __setattr__ aparentemente ha sido anulado para evitarlo.

Entonces ... ¿alguien sabe cómo hacerlo?


Aquí está el error que obtuve.

>>> c.current_schema = 'toto' 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: 'cx_Oracle.Connection' object has no attribute 'current_schema' 

>>> setattr(c, 'current_schema', 'toto') 
# same error 

Y aquí la información acerca del sistema operativo y Python:

SUSE LINUX Enterprise Server 9 (x86_64) 
VERSION = 9 
PATCHLEVEL = 3 

Y uso de Python 2.6.2 (compilado para 64bits)

Yo compilé cx_Oracle de 64bits, en el mismo misma máquina

+0

No existir como un atributo visible no significa mucho. '__setattr__' podría ser anulado para implementarlo de alguna manera misteriosa. Lo que es más importante que 'dir (c)' es el error real que realmente obtuviste cuando hiciste 'c.current_schema = 'toto''. –

Respuesta

6

Bien, finalmente, después de mucho intentarlo y error, seguí fn sugerencia e investigué dentro de cx_Oracle para encontrar lo que estaba mal.

Resulta que una serie de argumentos y métodos sólo están disponibles a través de algunas banderas:

  • WITH_UNICODE activa encoding y nencoding atributos
  • ORACLE_10G activa action, module, clientinfo y current_schema

Lo revisé y descubrí que había compilado cx_Oracle en contra de la versión 9 del cliente de Oracle ... así recompuse contra la versión 10.2.0.3 del cliente de Oracle y ahora tengo acceso a estos atributos.

Es una pena que la restricción no se haya precisado en la documentación ... y estoy muy agradecido de que el código fuente esté disponible.

2

Intente reinstalar cx_Oracle. Tu cx_Oracle probablemente esté en mal estado. ¿Cuál es su versión de sistema operativo y python?

+0

Acabo de instalarlo y no había una versión anterior que pudiera interferir ... –