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