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