如何从cx_Oracle扩展OracleCursor类

时间:2016-12-08 10:38:49

标签: python oop cx-oracle

使用Python 2.7.12和包cx_Oracle我试图创建包调用OracleCursor的扩展类。我只想继承超类中的方法并使用一些自定义方法进行扩展。

首先我通过

获得OracleCursor
import cx_Oracle

conn = cx_Oracle.connect(username, password, dsn)
cursor = conn.cursor()

然后我有以下

>>> type(cursor)Out[6]:
OracleCursor

>>> isinstance(cursor, cx_Oracle.Cursor)
True

有人会认为这是通过

来实现的
class ExtendedCursor(cx_Oracle.Cursor):

    def hello_world(self):
        print('Hello world')


extended = ExtendedCursor(cursor)

但我得到TypeError: argument 1 must be cx_Oracle.Connection, not OracleCursor。对我来说,这个错误没有意义。另外,我不能使用OracleCursor作为我的超类,因为它不被认为是一个类。

1 个答案:

答案 0 :(得分:3)

从Connection对象返回游标。您需要创建一个返回ExtendedCursor的自定义连接。

import cx_Oracle as cxo

class MyCursor(cxo.Cursor):
    def helloWorld(self):
        print "helloWorld"

class MyConnection(cxo.Connection):
    def cursor(self):
        return MyCursor(self)



if __name__ == '__main__':
    conStr = '<user>/<password>@127.0.0.1:1521/xe'
    db = MyConnection(conStr)
    c = db.cursor()

    print c

    c.execute('select 1+1 from dual')
    print(c.fetchall())

    c.helloWorld()

返回:

<__main__.MyCursor on <__main__.MyConnection to ...@127.0.0.1:1521/xe>>
[(2,)]
helloWorld