Hi all,
I've got a situation where I want to use inherited mappers, with joins
to other inherited mappers. However I'm getting some weird results
where the following query should show no cat objects, instead I get 2
back for both queries.
Can anyone spot the flaw in my code here ?
The api and test script are transcribed below.
Cheers
D
---
testapi.py
====
#!/usr/local/bin/python2.5
from sqlalchemy import *
from sqlalchemy.orm import *
session = scoped_session(
sessionmaker(autoflush=False, transactional=True)
)
mapper = session.mapper
metadata = MetaData()
ANIMAL_TYPE_DOG = 1
ANIMAL_TYPE_CAT = 2
animalTable = Table(
'animal',
metadata,
Column('id', Integer, primary_key=True),
Column('type', Integer, 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('type', Integer, nullable=False),
Column('address', String(100), nullable=False),
Column('kennel', Boolean, nullable=False),
)
class _Animal(object):
def printName(self):
print self.name
class Cat(_Animal):
pass
class Dog(_Animal):
pass
class _Vet(object):
def printAddress(self):
print self.address
class CatVet(_Vet):
pass
class DogVet(_Vet):
pass
animalMapper = mapper(
_Animal,
animalTable,
polymorphic_on=animalTable.c.type,
)
mapper(
Dog,
inherits=animalMapper,
polymorphic_identity=ANIMAL_TYPE_DOG,
properties = {
"vet": relation(
DogVet,
lazy=False,
)
}
)
mapper(
Cat,
inherits=animalMapper,
polymorphic_identity=ANIMAL_TYPE_CAT,
properties = {
"vet": relation(
CatVet,
lazy=False,
)
}
)
vetMapper = mapper(
_Vet,
vetTable,
polymorphic_on=vetTable.c.type,
)
mapper(
DogVet,
inherits=vetMapper,
polymorphic_identity=ANIMAL_TYPE_DOG,
)
mapper(
CatVet,
inherits=vetMapper,
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
====
#!/usr/local/bin/python2.5
import testapi as db
DB = "sqlite:///test.db"
db.connect(DB)
db.create()
v1 = db.DogVet()
v1.address = "12 Foo St"
v1.kennel = True
v2 = db.CatVet()
v2.address = "29 Bar Rd"
v2.kennel = False
v3 = db.CatVet()
v3.address = "29 Bar Rd"
v3.kennel = True
c1 = db.Cat()
c1.name = "muffin"
c1.vet = v2
c2 = db.Cat()
c2.name = "bagel"
c2.vet = v2
d1 = db.Dog()
d1.name = "rex"
d1.vet = v1
d2 = db.Dog()
d2.name = "bill"
d2.vet = v1
db.session.flush()
print db.Query(db.Cat).filter(db.CatVet.kennel == True).all()
print db.Query(db.Cat).filter(db.CatVet.kennel == False).all()
db.drop()
db.session.flush()
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---