On Mar 21, 2010, at 7:34 PM, Kevin Wormington wrote: > From DB2 logs it appears that the following is what's getting sent to DB2 and > resulting in the error: > > CALL BILLING.subscriber_balance(1000,?)( ) > > > This is using: > > print engine.execute(procedure("BILLING.subscriber_balance", subid, "?")) > > Any idea how I can get rid of the extra set of ()'s?
what does the logging at the Python level say ? whatever goes into callproc() is the most you can control. that recipe is allowing you to control the string output exactly. > > Thanks, > > Kevin > > Michael Bayer wrote: >> On Mar 21, 2010, at 12:50 PM, Kevin Wormington wrote: >>> Hi, >>> >>> I am using SQLAlchemy 0.5.8 with the ibm_db_sa (DB2) adapter and I am >>> wanting to add simple session.callproc support so that I can get results >>> from stored procedures that don't use a select or table format. I haven't >>> done any development on SA before but at first glance it appears that I >>> would just need to add the method in the ibm dialect class and into >>> engines/base.py to raise an exception for other dialects that don't support >>> it. Can it really be that easy? Also, if I implement this will it be a >>> possibility to get it integrated into future releases? >> So here's the things i ask/state about this: >> 1. IBM's dialect works with 0.5 ? it says its only for 0.4. >> 2. the callproc requirement here assumes that there's absolutely no way to >> make this work using plain execute(). For example with cx_oracle you can >> use outparams with plain execute(). I don't know the details here for DB2, >> but if callproc() really provides functionality that is impossible >> otherwise, then yes we need to examine ways to call it. >> 3. the way this feature would work would be: >> from sqlalchemy import procedure >> result = engine.execute(procedure.name_of_my_procedure(arg1, arg2, ...)) >> or with plain text or such, you can do this: >> result = engine.connect().execution_options(callproc=True).execute("my >> procedure...") >> 4. execution_options is only availble in 0.6. Similarly, any "built in" >> version of this feature would be for 0.6. >> 5. I'd like to have IBM's dialect on 0.6. Two ways to do this would either >> be to write a new dialect from scratch using their DBAPI, or to just port >> their 0.4/0.5 dialect to 0.6. I'd prefer the latter, but I don't know the >> licensing details. If IBM were to give me the "green light" I'd just wrap >> their dialect into SQLAlchemy core where all the other ones are. >> 6. in 0.5 or any, the functionality of #3 can be achieved using public API >> points, here's a demo: >> from sqlalchemy.ext.compiler import compiles >> from sqlalchemy.interfaces import ConnectionProxy >> from sqlalchemy.sql.expression import ClauseElement >> from sqlalchemy import create_engine >> class procedure(ClauseElement): >> supports_execution = True >> _autocommit = False >> _execution_options = {} >> def __init__(self, name, *args): >> self.name = name >> self.args = args >> @compiles(procedure) >> def compile_procedure(element, compiler, **kw): >> return "%s(%s)" % (element.name, ",".join(str(expr) for expr in >> element.args)) >> class ProcedureProxy(ConnectionProxy): >> def cursor_execute(self, execute, cursor, statement, parameters, context, >> executemany): >> """Intercept low-level cursor execute() events.""" >> if context and isinstance(context.compiled.statement, >> procedure): >> engine.logger.info("calling stored procedure: %s", statement) >> if hasattr(cursor, 'callproc'): >> return cursor.callproc(statement, parameters) >> else: >> return cursor.execute(statement, parameters) >> else: >> return execute(cursor, statement, parameters, context) >> engine = create_engine('sqlite://', proxy=ProcedureProxy(), echo=True) >> print engine.execute(procedure("pragma table_info", "foo")) >> >>> Kevin >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "sqlalchemy" group. >>> To post to this group, send email to sqlalch...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> sqlalchemy+unsubscr...@googlegroups.com. >>> For more options, visit this group at >>> http://groups.google.com/group/sqlalchemy?hl=en. >>> > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.