使用cx_Oracle修改模式

6 投票
2 回答
6529 浏览
提问于 2025-04-15 17:41

希望这不是重复的问题,我搜索了一下没有找到有用的信息。

我最近在玩 cx_Oracle,安装和使用它都很顺利。直到我遇到了一个问题:我想要更改我的模式。如果我在使用 sqlplus,只需要简单地输入 'alter session set 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

还有关于操作系统和 Python 的信息:

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

我使用的是 Python 2.6.2(为 64 位编译的)。

我也在同一台机器上为 64 位编译了 cx_Oracle

2 个回答

2

试着重新安装一下cx_Oracle。你的cx_Oracle可能出现问题了。请问你用的是什么操作系统和Python版本?

10

好吧,经过多次尝试和错误,我终于按照 fn 的建议,深入研究了一下 cx_Oracle,找到了问题所在。

结果发现,有一些参数和方法只有在开启特定的标志后才能使用:

  • WITH_UNICODE 可以激活 encodingnencoding 属性
  • ORACLE_10G 可以激活 actionmoduleclientinfocurrent_schema

我检查了一下,发现我编译的 cx_Oracle 是基于版本9的Oracle客户端……所以我重新编译了一下,使用的是10.2.0.3版本的Oracle客户端,现在我可以访问这些属性了。

真遗憾文档里没有明确说明这个限制……我非常感谢源代码是可以获取的。

撰写回答