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

Reply via email to