In SA 0.1.x I was able to execute sql using my own cursor like this: engine.execute(self.__sql, cursor=cursor, parameters=params)
the idea was to prepare some custom OUTPUT parameters. It all looked like this: cursor = engine.connection().cursor() result_var = cursor.var(getattr(engine.module, result_type)) # IMPORTANT params['sqlalchemy_result'] = result_var engine.execute(self.__sql, cursor=cursor, parameters=params) result = result_var.getvalue() I'm using all this inside my custom Oracle Function implementation. How can I do something similar in SA 0.3 (the ability to execute statements via my cursor is not important, but rather the ability to bind/access output parameters)? There are two reasons for my custom implementation of "func": 1. be able to call proc/func with keyword arguments - standard practice in Oracle 2. be able to call procedures I guess I can do part of this via "SELECT func FROM dual", but I had some reason for not doing it that way. If I remember correctly, It was because I wanted support for output parameters in general, so instead of doing part of code via select from dual and part of code via begin/end/output I chose to do it all via begin/end/output. Entire code is this: def encdict(encoding, **kw): res = {} for k,v in kw.items(): res[k] = isinstance(v,unicode) and v.encode(encoding) or v return res class OraFunExec(object): def __init__(self, kind, sql, params): self.__kind = kind self.__sql = sql self.__params = params def sql(self): return self.__sql def execute(self, engine, result_type='NUMBER'): # STRING, DATETIME params = encdict(engine.encoding, **self.__params) if self.__kind=="proc": engine.execute(self.__sql, params) else: cursor = engine.connection().cursor() result_var = cursor.var(getattr(engine.module, result_type)) params['sqlalchemy_result'] = result_var engine.execute(self.__sql, cursor=cursor, parameters=params) result = result_var.getvalue() if isinstance(result, str): result = unicode(result, engine.encoding) elif isinstance(result, float): ir = int(result) if result-ir==0: result = ir return result class OraFunGen(object): def __init__(self, kind): self.__kind = kind self.__names = [] def __getattr__(self, name): self.__names.append(name) return self def __call__(self, **kwargs): if self.__kind=='proc': text = "BEGIN %s%s; END;" else: text = "BEGIN :sqlalchemy_result := %s%s; END;" name = ".".join(self.__names) if kwargs: args = "(%s)" % ", ".join(["%s => :%s" % (k,k) for k in kwargs]) else: args = "" sql = text % (name, args) return OraFunExec(self.__kind, sql, kwargs) class OraFunGateway(object): """returns a callable based on an attribute name, which then returns a Function object with that name.""" def __init__(self, kind): self.__kind = kind def __getattr__(self, name): return getattr(OraFunGen(self.__kind), name) orafun = OraFunGateway('func') orapro = OraFunGateway('proc') Currently, I have something like this, but it doesn't work: conn = engine.contextual_connect() cursor = conn.connection.cursor() result_var = cursor.var(getattr(engine.dialect.module, result_type)) params['sqlalchemy_result'] = result_var engine.execute(self.__sql, cursor=cursor, parameters=params) result = result_var.getvalue() conn.close() There are problems with "cursor=cursor" part. Also, do I have to close conn (I'm using threadlocal strategy)? Regards, Tvrtko --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---