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 sqlalchemy@googlegroups.com
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