2016-12-08 4 views
0

En utilisant Python 2.7.12 et le paquet cx_Oracle J'essaie de créer une classe étendue de ce que le paquet appelle OracleCursor. Je veux simplement hériter des méthodes de la superclasse et étendre avec certaines méthodes personnalisées.Comment étendre la classe OracleCursor à partir de cx_Oracle

D'abord j'obtenir le OracleCursor par

import cx_Oracle 

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

et j'ai alors le suivant

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

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

On pourrait penser qu'il est atteint par

class ExtendedCursor(cx_Oracle.Cursor): 

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


extended = ExtendedCursor(cursor) 

mais je reçois TypeError: argument 1 must be cx_Oracle.Connection, not OracleCursor. Pour moi, cette erreur n'a pas de sens. En outre, je ne peux pas utiliser OracleCursor en tant que ma super-classe, car il n'est pas reconnu comme une classe.

Répondre

3

Le curseur est renvoyé à partir de l'objet Connection. Vous devez créer une connexion personnalisée qui renvoie votre 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() 

retours:

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