Yeah once I'd worked it out I converted the field over to being an
int field, just didn't see this one coming :-) Maybe something worth
adding into the doco if it's going to stick around ?
On Monday 07 January 2008 02:03:19 Michael Bayer wrote:
> yeah thats line 1303 of mapper.py. i think i might have made that
> change right in 0.4.2 thinking, nobody would use a boolean "False" as
> a discriminator....any chance you can go with some plain int or
> string for that ?
>
> On Jan 5, 2008, at 11:47 PM, Dave Harrison wrote:
> > Hey all,
> >
> > More fun with inheritance and mappers. In the following situation
> > where the polymorphic type is a Boolean, the mapper for the object
> > that matches on False incorrectly returns the parent object.
> >
> > Cheers
> > Dave
> >
> > ------------------------------
> > -- testapi.py ----------------
> > ------------------------------
> >
> > from sqlalchemy import *
> > from sqlalchemy.orm import *
> >
> > session = scoped_session(
> > sessionmaker(autoflush=False, transactional=True)
> > )
> > mapper = session.mapper
> > metadata = MetaData()
> >
> > ANIMAL_TYPE_DOG = True
> > ANIMAL_TYPE_CAT = False
> >
> > VET_TYPE_CITY = 1
> > VET_TYPE_COUNTRY = 2
> >
> > animalTable = Table(
> > 'animal',
> > metadata,
> > Column('id', Integer, primary_key=True),
> > Column('type', Boolean, nullable=False),
> > Column('name', String(100), nullable=False),
> > Column('vet_id', Integer, ForeignKey('vet.id')),
> > )
> >
> > vetTable = Table(
> > 'vet',
> > metadata,
> > Column('id', Integer, primary_key=True),
> > Column('address', String(100), nullable=False),
> > Column('kennel', Boolean, nullable=False),
> > )
> >
> > class _Animal(object):
> > pass
> > class Cat(_Animal):
> > pass
> > class Dog(_Animal):
> > pass
> > class Vet(object):
> > pass
> >
> > vetMapper = mapper(
> > Vet,
> > vetTable,
> > properties = {
> > "animals": relation(
> > _Animal,
> > backref=backref("vet", uselist=False),
> > cascade="all, delete-orphan"
> > ),
> > }
> > )
> >
> > animalMapper = mapper(
> > _Animal,
> > animalTable,
> > polymorphic_on=animalTable.c.type,
> > )
> > mapper(
> > Dog,
> > inherits=animalMapper,
> > polymorphic_identity=ANIMAL_TYPE_DOG,
> > )
> > mapper(
> > Cat,
> > inherits=animalMapper,
> > polymorphic_identity=ANIMAL_TYPE_CAT,
> > )
> >
> > def connect(uri):
> > engine = create_engine(uri, strategy="threadlocal")
> > metadata.bind = engine
> > return engine
> >
> > def create():
> > metadata.create_all()
> >
> > def drop():
> > metadata.drop_all()
> >
> > ------------------------------
> > -- test.py ----------------
> > ------------------------------
> >
> > import sys
> > import testapi as db
> >
> > DB = "sqlite:///memory"
> > db.connect(DB)
> > db.create()
> >
> > v = db.Vet()
> > v.address = "12 Foo St"
> > v.kennel = True
> >
> > c1 = db.Cat()
> > c1.name = "muffin"
> >
> > c2 = db.Cat()
> > c2.name = "bagel"
> >
> > d1 = db.Dog()
> > d1.name = "rex"
> >
> > d2 = db.Dog()
> > d2.name = "bill"
> >
> > db.session.flush()
> > db.session.clear()
> >
> > for d in db.Query(db.Dog).all():
> > v.animals.append(d)
> > for c in db.Query(db.Cat).all():
> > v.animals.append(c)
> >
> > db.session.flush()
> > db.session.clear()
> >
> > v = db.Query(db.Vet).first()
> > for a in v.animals:
> > print a
>
>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---