Thanks for your reply, > 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 ? ) >
I want to use it like this fixRace(dbPeople, myrace) listofgreeks=session.query(dbPeople.inRace).select_by(Nationality="Greece") listofresident=session.query(dbPeople.inRace).select_by(Country="Germany") So I need to have the "inRace" mapper an attribute of the class itself. I'll stick to what I have right now, it seems to work fine. Cheers, François > 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==tblRacePar >ticipant.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=Fa > >lse,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 -~----------~----~----~----~------~----~------~--~---