Files
sqlalchemy/test/perf/large_flush.py
T
Mike Bayer 20cdc64588 trying different approaches to test layout. in this one, the testing modules
become an externally usable package but still remains within the main sqlalchemy parent package.
in this system, we use kind of an ugly hack to get the noseplugin imported outside of the
"sqlalchemy" package, while still making it available within sqlalchemy for usage by
third party libraries.
2012-09-27 02:37:33 -04:00

84 lines
2.5 KiB
Python

import sqlalchemy as sa
from sqlalchemy import create_engine, MetaData, orm
from sqlalchemy import Column, ForeignKey
from sqlalchemy import Integer, String
from sqlalchemy.orm import mapper
from sqlalchemy.testing import profiling
class Object(object):
pass
class Q(Object):
pass
class A(Object):
pass
class C(Object):
pass
class WC(C):
pass
engine = create_engine('sqlite:///:memory:', echo=True)
sm = orm.sessionmaker(bind=engine)
SA_Session = orm.scoped_session(sm)
SA_Metadata = MetaData()
object_table = sa.Table('Object',
SA_Metadata,
Column('ObjectID', Integer,primary_key=True),
Column('Type', String(1), nullable=False))
q_table = sa.Table('Q',
SA_Metadata,
Column('QID', Integer, ForeignKey('Object.ObjectID'),primary_key=True))
c_table = sa.Table('C',
SA_Metadata,
Column('CID', Integer, ForeignKey('Object.ObjectID'),primary_key=True))
wc_table = sa.Table('WC',
SA_Metadata,
Column('WCID', Integer, ForeignKey('C.CID'), primary_key=True))
a_table = sa.Table('A',
SA_Metadata,
Column('AID', Integer, ForeignKey('Object.ObjectID'),primary_key=True),
Column('QID', Integer, ForeignKey('Q.QID')),
Column('CID', Integer, ForeignKey('C.CID')))
mapper(Object, object_table, polymorphic_on=object_table.c.Type, polymorphic_identity='O')
mapper(Q, q_table, inherits=Object, polymorphic_identity='Q')
mapper(C, c_table, inherits=Object, polymorphic_identity='C')
mapper(WC, wc_table, inherits=C, polymorphic_identity='W')
mapper(A, a_table, inherits=Object, polymorphic_identity='A',
properties = {
'Q' : orm.relation(Q,primaryjoin=a_table.c.QID==q_table.c.QID,
backref='As'
),
'C' : orm.relation(C,primaryjoin=a_table.c.CID==c_table.c.CID,
backref='A',
uselist=False)
}
)
SA_Metadata.create_all(engine)
@profiling.profiled('large_flush', always=True, sort=['file'])
def generate_error():
q = Q()
for j in range(100): #at 306 the error does not pop out (depending on recursion depth)
a = A()
a.Q = q
a.C = WC()
SA_Session.add(q)
SA_Session.commit() #here the error pops out
generate_error()