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 [email protected].
>>> 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.
>>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> 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.
>
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
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.