OK, i had the impression you were switching the mapper inside of a
relation() somehow, but it seems all youre doing is sticking a mapper
on a property (i dont quite understand how youd use it ?  )

if i understand properly, id just do it this way:

class dbPeople(object):
    def fixRace(self, race):
        self._race_id = race.id
    def _in_race(self):
        return object_session(self).query(dbRace).select(
and_(tblRaceParticipant.c.Race_id==self._race_id,tblPeople.c.id==tblRaceParticipant.c.Racer_id))
    inRace = property(_in_race)



François Wautier wrote:
> Hi Michael,
>
> Thanks for your reply.
>
> First an apology, my program is now working.... It was a silly mistake...
>
> Second, I agree that what I am doing is not the most elegant thing I've ever 
> done...
> .to put it mildly... Yet, in most cases, the "fixRace" function will only be 
> run once at startup .....
> In all but one case you only deal with one race.  So that's not as bad as it 
> sounds...
> Still the application that input data into the database does need to deal 
> with multiple races.
> In that case I only keep one secondary mapper attached to the class and only 
> create a new
> one when needed (i.e. when the race changes) (I probably need to "delete" the 
> old mapper if present)
>
> At the bottom you will see the actual definition/mapping I use.
>
> I guess that I may be able to map the various attributes of dbPeople and 
> dbRace to attributes of dbRaceParticipant
> and deal with that object when needed,   but I still see no elegant way of 
> "fixing" the race, either I
> create a secondary mapper (same as now essentially) or I need to pass the 
> race as an argument
> to all my queries... which is exactly what I am trying to avoid.
>
> Cheers,
>       François
>
> Here is an excerpt of my definitions.... draft in progress
>
> =========+%<================%<================
> tblPeople=Table("People",
>     Column("id", Integer, primary_key = True),
>     Column("Nickname",Unicode(32),nullable=False,index=True),
>     Column("Firstname",Unicode(32),nullable=False),
>     Column("Lastname",Unicode(32),nullable=False,index=True),
>     Column("Email",VARCHAR(64),index=True),
>     Column("Birthdate",Date),
>     Column("Gender",Enum(["Male","Female"]),nullable=False),
>     Column("Nationality",Country,nullable=False),
>     Column("Address",Unicode(256)),
>     Column("Zip",Unicode(32)),
>     Column("Country",Country),
>     Column("Tel",String(16)),
>     Column("Tel_Ext",String(4)),
>     Column("Mobile",String(16)),
>     Column("Picture_id",Integer,ForeignKey("ADM_Files.id"), nullable=True),
>     Column("Tag",String(32)),
>     Column("Active",Boolean,default=True))
>
> tbbPeopleidx=Index('OnlyOne', tblPeople.c.Nickname,tblPeople.c.Firstname, 
> tblPeople.c.Lastname, unique=True)
>
> class dbPeople(object):
>
>     def __str__(self):
>         return self.Fullname()
>
>     def Fullname(self):
>         return unicode(self.Firstname)+u" "+unicode(self.Lastname)
>
>     def age(self,adate=None):
>         """Compute the age of a person. If adate is set the age is computed
>         at the given date"""
>         if adate is None:
>             adate=datetime.date.today()
>         myage=adate.year-self.Birthdate.year
>         if adate.month<self.Birthdate.month:
>             myage -=1
>         elif adate.month==self.Birthdate.month:
>             if adate.day<self.Birthdate.day:
>                 myage -=1
>         return myage
>
>
> # Mapping a Racer with a Race
> tblRaceParticipant=Table("Race_Participant",
>     Column("id", Integer, primary_key = True),
>     Column("Race_id",Integer,ForeignKey("Race.id"), nullable=False),
>     Column("Racer_id",Integer,ForeignKey('People.id'), nullable=False),
>     Column("Team_id",Integer,ForeignKey('Team.id'), nullable=True),
>     Column("Weight",DECIMAL(4,1), nullable=True),
>     Column("Age",Integer, nullable=True),
>     Column("Height",Integer, nullable=True),
>     #Column("Categories",String, nullable=True),
>     Column("isActive",Boolean, nullable=False,default=True),
>     Column("Retired",TIMESTAMP, nullable=True),
>     Column("Comment",Unicode))
>
> tbbParticipantidx=Index('OnlyOne', 
> tblRaceParticipant.c.Race_id,tblRaceParticipant.c.Racer_id, unique=True)
>
> class dbRaceParticipant(object):
>
>     def __str__(self):
>         return str(self.Racer)+u" during "+str(self.Race)
>
> #Defining races
> tblRace=Table("Race",
>     Column("id", Integer, primary_key = True),
>     Column("Name",Unicode(64),nullable=False),
>     Column("Type",Enum(["Team","Individual"]),nullable=False),    
> Column("Vehicle",Enum(["None","One","Multiple","Individual"]),nullable=False,default="One"),
>     Column("Organiser_id",Integer,ForeignKey('People.id'),nullable=True),
>     Column("Description",Unicode),
>     Column("Logo_id",Integer,ForeignKey("ADM_Files.id"), nullable=True),
>     Column("Standing",Unicode(32)))
>
>
> class dbRace(object):
>     def __str__(self):
>         return self.Name
>
>     def getRegistrationRecord(self,people):
>         """There must be a session here"""
>         for rec in self.Registration:
>             if rec.Racer==people:
>                 return rec
>
> #
> dbRaceParticipant.mapper=mapper(dbRaceParticipant, tblRaceParticipant,
>       properties = {
>       'Races' : relation(dbRace, backref=backref('Registration')),
>       'Racer' : relation(dbPeople, backref=backref('Registration')),
>       "Team":relation(dbTeam )})
>
> # Organiser with back reference
> dbRace.mapper=mapper(dbRace, tblRace,
>       properties = {
>       'Organiser' : relation(dbPeople, backref=backref('Organise')),
>       "Racers":relation(dbPeople,secondary=tblRaceParticipant,
>               primaryjoin=tblRace.c.id==tblRaceParticipant.c.Race_id,
>               secondaryjoin=tblPeople.c.id==tblRaceParticipant.c.Racer_id),
>       "Teams":relation(dbTeam,secondary=tblRaceParticipant,
>               primaryjoin=tblRace.c.id==tblRaceParticipant.c.Race_id,
>               secondaryjoin=tblTeam.c.id==tblRaceParticipant.c.Team_id),
>       "Logo":relation(dbFile)})
>
>
> # Picture is mapped to the corresponding file.
> #We have a list of participation record
> dbPeople.mapper=mapper(dbPeople, tblPeople, properties = {'Picture' : 
> relation(dbFile, cascade="all")})
>
> def fixRace(obj,race):
>         """Create a secondary mapper where the race is fixed
>
>         This has nothing to do with "fixing races",  This limits the
>        dataset to those records directly related to the race at hand
>         """
>         if isinstance(race,int):
>             myraceid=race
>         else:
>             myraceid=race.id
>
>         try:
>             test=obj.fixedRaceId != myraceid
>         except:
>             test=True
>
>         if test:
>             if obj==dbPeople:
>                 
> s=tblPeople.select(and_(tblRaceParticipant.c.Race_id==myraceid,tblPeople.c.id==tblRaceParticipant.c.Racer_id)).alias("per_race_select")
>
>                 dbPeople.inRace=mapper(dbPeople,s,non_primary=True)
>
>
> =========+%<================%<================
>
>
> > Michael Bayer wrote:
> > if you are creating mappers within functions on a per-request basis,
> > that is a Very Bad Idea.  dont create ad-hoc mappers just to create
> > queries.  you should only have one mapper per class, corresponding to
> > the scope of the class itself.  i am beginning to consider if the
> > "non_primary" keyword argument to mapper can even be deprecated since i
> > am hypothesizing that it doesn't provide any unique functionality, and
> > only leads to problems.
> >
> > if you want a particualr query to occur, you should create the query
> > you want yourself.  without seeing anything that you are doing, if you
> > are having issues, things like that would be the biggest reason.
> >
> >


--~--~---------~--~----~------------~-------~--~----~
 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to