the code u've given is quite incomplete.
i couldnt get it to work with responses.join(presentations), so i put 
just responses, and added property 
presentation=relation(Presentation)
and it returns same results.

try just executing whole query....count() by hand twice without all 
the funcs, and see.


On Friday 12 December 2008 07:57:13 channing wrote:
> I have a weird problem: Two identical functions, created using a
> lambda from the same issuing identical SQL, return two different
> answers. I'm embarrassed to say this, but it looks stochastic. I'm
> running 0.4.2p3 with Python 2.5.2 and Ipython 0.8.1.
>
> First, the guided tour. I'm using a lambda function to make new,
> single-argument versions of a multi-argument function:
>
> def _parse_fun(fun, fun_args=None):
>     return lambda x: fun.__call__(x,fun_args)
>
> Now I have another function that does some filtering and counting:
>
> def n_classresps(unit,class_name):
>     return query(ClassResponse).filter_by(unit=unit)\
>                 .filter_by(class_name=class_name).count()
>
> And I use _parse_fun to set the value of the class_name argument:
>
> yf = _parse_fun(n_classresps,'noise')
>
> The problem comes when I make multiple instances:
>
> foo = _parse_fun(n_classresps,'noise')
>
> Now calling yf and foo returns different results: yf(qunits[0])
> returns 0, while foo(qunits[0]) returns 3.
>
> I've included a model below that reproduces my problem. The server
> is a test server that only I'm using, so the database isn't
> changing. I have this saved to a file, and I run it in IPython
> 0.8.1 using the run command. After running, if I define
>
> foo = _parse_fun(n_classresps,'zf song')
>
> And foo(qunits[0]) gives me 3. Then I define
>
> bar = _parse_fun(n_classresps,'zf song')
>
> Now bar(qunits[0]) gives me 0. See where this is going?
>
> The version in my full app reliably gives me the wrong answer,
> despite issuing the right SQL. I've set engine.echo=True and
> enabled query logging on the MySQL server, and the SQL is all fine.
> Running the SQL with engine.execute gives the right answer, as does
> running the SQL from a command-line tool.
>
> Any ideas as to what could be causing this? I am at a complete
> loss.
>
> Thanks,
>
> Channing
>
> --------------- Code follows -----------------
>
> from sqlalchemy import MetaData, Table, Column, ForeignKey,
> create_engine, Integer, String, select
> from sqlalchemy.orm import mapper, relation, ColumnProperty,
> scoped_session, sessionmaker
> from sqlalchemy.databases.mysql import MSEnum
>
> '''
> Set up engine
> '''
> engine = create_engine(*****)
> Session = scoped_session(sessionmaker(autoflush=True,
> transactional=True,
>                                       bind=engine))
> metadata = MetaData(engine)
> query = Session.query
>
> def _parse_fun(fun,fun_args=None):
>     return lambda x: fun.__call__(x,fun_args)
>
> def n_classresps(unit,class_name):
>     return query(ClassResponse)\
>                 .filter_by(unit=unit)\
>                 .filter_by(class_name=class_name)\
>                 .count()
>
> class Presentation(object):
>     pass
>
> class Response(object):
>     pass
>
> class Unit(object):
>     pass
>
> class ClassPresentation(Presentation):
>     pass
>
> class ClassResponse(Response):
>     pass
>
> presentations = Table('presentations', metadata,
>                       Column('presentation_id', Integer,
>                              primary_key=True, nullable=False),
>                       Column('block_id', Integer, nullable=False),
>                       Column('type', MSEnum
> ('single','repeated','class'),
>                              nullable=False)
>                       )
>
> responses = Table('responses', metadata,
>                   Column('response_id', Integer,
>                          primary_key=True, nullable=False),
>                   Column('unit_id', Integer,
>                          ForeignKey('units.unit_id'),
>                          nullable=False),
>                   Column(u'presentation_id', Integer,
>                         
> ForeignKey('presentations.presentation_id'), nullable=False)
>                   )
>
> class_presentations = Table('class_presentations', metadata,
>                             Column('presentation_id', Integer,
>                                    ForeignKey
> ('presentations.presentation_id'),
>                                    primary_key=True,
> nullable=False), Column('class_name', String,
> nullable=False)
>                             )
>
> units = Table('units', metadata,
>               Column('unit_id', Integer, primary_key=True,
>                      nullable=False),
>               Column('recsite_id', Integer, nullable=False),
>               Column('type',
> MSEnum('extracellular','intracellular'), nullable=False)
>               )
>
> mapper(Presentation,presentations,
>        polymorphic_on=presentations.c.type,
>        polymorphic_identity='presentation')
>
> rmapper = mapper(Response,responses.join(presentations),
>                  polymorphic_on=presentations.c.type,
>                  polymorphic_identity='response',
>                  properties={'unit':relation(Unit)})
>
> mapper(Unit,units)
>
> mapper(ClassPresentation,class_presentations,
>        inherits=Presentation,
>        polymorphic_identity='class')
>
> mapper(ClassResponse, inherits=rmapper,
>        polymorphic_identity='class',
>        properties={'class_name':ColumnProperty(select
> ([class_presentations.c.class_name],
>
> responses.c.presentation_id==class_presentations.c.presentation_id)
>\ .label ('class_name'))})
>
> ''' The actual code that fails'''
> qunits = query(Unit)
> yf = _parse_fun(n_classresps,'zf_song')
> a = yf(qunits[0])
> #foo = _parse_fun(n_classresps,'zf_song')
> 


--~--~---------~--~----~------------~-------~--~----~
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 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to