2016-12-08 2 views
0

Mit Python 2.7.12 und Paket cx_Oracle Ich versuche, eine erweiterte Klasse von dem, was das Paket OracleCursor aufrufen. Ich möchte einfach die Methoden von der Oberklasse erben und mit einigen benutzerdefinierten Methoden erweitern.So erweitern OracleCursor-Klasse von Cx_Oracle

Zuerst bekomme ich die OracleCursor von

import cx_Oracle 

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

und ich habe dann die folgende

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

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

Man würde denken, dass es durch

class ExtendedCursor(cx_Oracle.Cursor): 

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


extended = ExtendedCursor(cursor) 

erreicht, aber ich bekomme TypeError: argument 1 must be cx_Oracle.Connection, not OracleCursor. Für mich macht dieser Fehler keinen Sinn. Außerdem kann ich OracleCursor nicht als meine Oberklasse verwenden, da sie nicht als Klasse erkannt wird.

Antwort

3

Der Cursor wird vom Connection-Objekt zurückgegeben. Sie müssen eine benutzerdefinierte Verbindung erstellen, die Ihren ExtendedCursor zurückgibt.

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

kehrt:

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