mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-28 03:26:01 -04:00
20cdc64588
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.
84 lines
2.5 KiB
Python
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() |