Allan L Allan L - 4 months ago 8
Python Question

Calling Class, getting TypeError: unbound method must be called

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?

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