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