> so, brand new underlying UnitOfWork, brand new dictionary. Since i
> dont understand the case you are describing (how do you "select"
> items of class C from class A ? i dont understand what that means),
> you might want to attach a reproducible test case.
okay just ran some tests and it happens when i have A<-B<-C<-D
inheritance
I'm using multiple table polymorphic inheritance (as described in the
docs)
so i can do A.select() and get a list of A,B,C and D instances, which
works fine
except when i clear the session, instances of D have their members
unitialized
here's a sample test:
from sqlalchemy import *
metadata = BoundMetaData('sqlite:///')
class A(object):
def __init__(self, a):
self.a = a
def __repr__(self):
return '<A a=%s>' % self.a
class B(A):
def __init__(self, a, b):
self.a = a
self.b = b
def __repr__(self):
return '<B a=%s b=%s>' % (self.a, self.b)
class C(B):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __repr__(self):
return '<C a=%s b=%s c=%s>' % (self.a, self.b, self.c)
class D(C):
def __init__(self, a, b, c, d):
self.a = a
self.b = b
self.c = c
self.d = d
def __repr__(self):
return '<D a=%s b=%s c=%s d=%s>' % (self.a, self.b, self.c,
self.d)
a_table = Table('a_table', metadata,
Column('id', Integer, primary_key=True),
Column('a', String(32)),
Column('type', String(30)))
b_table = Table('b_table', metadata,
Column('id', Integer, ForeignKey('a_table.id'),
primary_key=True),
Column('b', String(32)))
c_table = Table('c_table', metadata,
Column('id', Integer, ForeignKey('b_table.id'),
primary_key=True),
Column('c', String(32)))
d_table = Table('d_table', metadata,
Column('id', Integer, ForeignKey('c_table.id'),
primary_key=True),
Column('d', String(32)))
abcd_union = polymorphic_union(
{
'd':a_table.join(b_table).join(c_table).join(d_table),
'c':a_table.join(b_table).join(c_table),
'b':a_table.join(b_table),
'a':a_table.select(a_table.c.type=='a')
}, None)
bcd_union = polymorphic_union(
{
'd':a_table.join(b_table).join(c_table).join(d_table),
'c':a_table.join(b_table).join(c_table),
'b':a_table.join(b_table),
}, None)
cd_union = polymorphic_union(
{
'd':a_table.join(b_table).join(c_table).join(d_table),
'c':a_table.join(b_table).join(c_table),
}, None)
a_mapper = mapper(A, a_table, select_table=abcd_union,
polymorphic_on=abcd_union.c.type, polymorphic_identity='a')
b_mapper = mapper(B, b_table, select_table=bcd_union,
inherits=a_mapper, polymorphic_on=bcd_union.c.type,
polymorphic_identity='b')
c_mapper = mapper(C, c_table, select_table=cd_union,
inherits=b_mapper, polymorphic_on=cd_union.c.type,
polymorphic_identity='c')
mapper(D, d_table, inherits=c_mapper, polymorphic_identity='d')
a_table.create()
b_table.create()
c_table.create()
d_table.create()
session = create_session()
session.save(A(a='aaa'))
session.save(B(a='aaa',b='bbb'))
session.save(C(a='aaa',b='bbb',c='ccc'))
session.save(D(a='aaa',b='bbb',c='ccc',d='ddd'))
session.flush()
#comment this clear for success
session.clear()
l = session.query(A).select()
print l
l = session.query(D).select()
assert l[0].d == 'ddd'
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---