Изменение схемы с помощью cx_Oracle

Ну надеюсь это не дубликат, поиск ничего полезного не дал.

Последние несколько дней я играл с cx_Oracle, устанавливая и используя его. Все шло хорошо, пока я не достиг своей текущей проблемы: я хотел бы изменить свою схему. Если бы я использовал sqlplus, просто "изменить набор сеансов current_schema=toto;" сойдет, но я не знаю, как это обойти с помощью cx_Oracle.

Я скачал последнюю исходную версию: cx_Oracle-5.0.2.tar.gz.

Согласно документации изменение схемы — это простой случай установки Connection.current_schema, который должен быть атрибутом чтения-записи... проблема в том, что мой объект Connection не имеет атрибута 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']

Попытка установить атрибут с помощью

>>> c.current_schema = 'toto'

приводит к ошибке... __setattr__, по-видимому, был переопределен, чтобы предотвратить это.

Так... кто-нибудь знает, как?


Вот ошибка, которую я получил.

>>> 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

А вот информация об ОС и питоне:

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

И я использую python 2.6.2 (скомпилирован для 64 бит)

Я также скомпилировал cx_Oracle для 64-битной версии на той же машине.


person Matthieu M.    schedule 06.01.2010    source источник
comment
Несуществование в качестве видимого атрибута мало что значит. __setattr__ можно было бы переопределить, чтобы реализовать его каким-то таинственным образом. Что более важно, чем dir(c), так это реальная ошибка, которую вы на самом деле получили, когда действительно сделали c.current_schema='toto'.   -  person S.Lott    schedule 06.01.2010


Ответы (2)


Хорошо, я, наконец, после долгих попыток и ошибок, последовал fn предложению и исследовал cx_Oracle внутри, чтобы найти, что не так.

Получается, что ряд аргументов и методов доступен только через некоторые флаги:

  • WITH_UNICODE активирует атрибуты encoding и nencoding
  • ORACLE_10G активирует action, module, clientinfo и current_schema

Я проверил и обнаружил, что скомпилировал cx_Oracle для версии 9 клиента оракула... поэтому я перекомпилировал для версии 10.2.0.3 клиента оракула, и теперь у меня есть доступ к этим атрибутам.

Жаль, что это ограничение не было уточнено в документации... и я очень благодарен, что исходный код доступен.

person Matthieu M.    schedule 06.01.2010

Попробуйте переустановить cx_Oracle. Ваш cx_Oracle, вероятно, запутался. Какая у вас ОС и версия Python?

person fn.    schedule 06.01.2010
comment
Я только что установил его, и не было предыдущей версии, которая могла бы помешать ... - person Matthieu M.; 06.01.2010