Calling Class, getting TypeError: unbound method must be called
Question: I have reviewed the error on Stackoverflow, but none of the solutions I've
seen resolve my problem. I'm attempting to create a class for cx_Oracle to put
my database connectivity in a class, and call it during my database instances.
I've created similar classes in C#, but python is especially difficult for
some reason. Any assistance appreciated.

I leveraged this code found here: [cx_Oracle and Exception Handling - Good
practices?](http://stackoverflow.com/questions/7465889/cx-oracle-and-
exception-handling-good-practices)

    
    
        import sys
        import os
        import cx_Oracle
    
        class Oracle(object):
    
            __db_server = os.getenv("ORACLE_SERVER")
            __db_user = os.getenv("ORACLE_ACCT")
            __db_password = os.getenv("ORACLE_PWD")
    
            def connect(self):
                """ Connect to the database. """
    
                try:
                    self.db = cx_Oracle.connect(__db_user+'/'+__db_password+'@'+__db_server)
                except cx_Oracle.DatabaseError as e:
                    error, = e.args
                    if error.code == 1017:
                        print('Please check your credentials.')
                    else:
                        print('Database connection error: %s'.format(e))
                    # Very important part!
                    raise
    
                # If the database connection succeeded create the cursor
                # we-re going to use.
                self.cursor = db.Cursor()
    
            def disconnect(self):
                """
                Disconnect from the database. If this fails, for instance
                if the connection instance doesn't exist we don't really care.
                """
    
                try:
                    self.cursor.close()
                    self.db.close()
                except cx_Oracle.DatabaseError:
                    pass
    
            def execute(self, sql, bindvars=None, commit=False):
                """
                Execute whatever SQL statements are passed to the method;
                commit if specified. Do not specify fetchall() in here as
                the SQL statement may not be a select.
                bindvars is a dictionary of variables you pass to execute.
                """
    
                try:
                    self.cursor.execute(sql, bindvars)
                except cx_Oracle.DatabaseError as e:
                    error, = e.args
                    if error.code == 955:
                        print('Table already exists')
                    elif error.code == 1031:
                        print("Insufficient privileges")
                    print(error.code)
                    print(error.message)
                    print(error.context)
    
                    # Raise the exception.
                    raise
    
                # Only commit if it-s necessary.
                if commit:
                    self.db.commit()
    
            def select(self, sql, commit=False):        
                bindvars=None
                result = None
                try:
                    self.cursor.execute(sql, bindvars)
                    result = self.cursor.fetchall()
                except cx_Oracle.DatabaseError as e:
                    error, = e.args
                    print "Database Error: failed with error code:%d - %s" % (error.code, error.message)
                    raise
                if commit:
                    self.db.commit()
                return result
    
            def commit(self):
                try:
                    self.db.commit()
                except cx_Oracle.DatabaseError as e:
                    error, = e.args
                    print "Database Commit failed with error code:%d - %s" % (error.code, error.message)
                    raise
    
            def rollback(self):
                try:
                    self.db.rollback()
                except cx_Oracle.DatabaseError as e:
                    error, = e.args
                    print "Database Rollback failed with error code:%d - %s" %(error.code, error.message)
                    raise
    

And this is my calling routine

    
    
        import sys
        import os
        #import cx_Oracle
        from Oracle import Oracle
    
        def main():
            oracle = Oracle.connect()
            query = """SELECT DISTINCT NAME FROM MyTable"""
            data = oracle.select(query)
            for row in data:
                print row
            oracle.disconnect()
    
        ### MAIN
        if __name__ == '__main__':
            main()
    

On a related note: I can't seem to get Python to find my Oracle.py class,
unless it's in the same directory as the calling function.

Allan


Answer: You have to create an instance of your class to use it:

    
    
    orcl = Oracle()
    orcl.connect()
    ...
    

