mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-30 12:34:52 -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.
96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
from sqlalchemy import *
|
|
from sqlalchemy.orm import *
|
|
|
|
from sqlalchemy.testing.compat import gc_collect
|
|
from sqlalchemy.testing import AssertsExecutionResults, profiling, testing
|
|
from test.orm import _fixtures
|
|
|
|
# in this test we are specifically looking for time spent in the attributes.InstanceState.__cleanup() method.
|
|
|
|
ITERATIONS = 100
|
|
|
|
class SessionTest(fixtures.TestBase, AssertsExecutionResults):
|
|
@classmethod
|
|
def setup_class(cls):
|
|
global t1, t2, metadata,T1, T2
|
|
metadata = MetaData(testing.db)
|
|
t1 = Table('t1', metadata,
|
|
Column('c1', Integer, primary_key=True),
|
|
Column('c2', String(30)))
|
|
|
|
t2 = Table('t2', metadata,
|
|
Column('c1', Integer, primary_key=True),
|
|
Column('c2', String(30)),
|
|
Column('t1id', Integer, ForeignKey('t1.c1'))
|
|
)
|
|
|
|
metadata.create_all()
|
|
|
|
l = []
|
|
for x in range(1,51):
|
|
l.append({'c2':'this is t1 #%d' % x})
|
|
t1.insert().execute(*l)
|
|
for x in range(1, 51):
|
|
l = []
|
|
for y in range(1, 100):
|
|
l.append({'c2':'this is t2 #%d' % y, 't1id':x})
|
|
t2.insert().execute(*l)
|
|
|
|
class T1(fixtures.ComparableEntity):
|
|
pass
|
|
class T2(fixtures.ComparableEntity):
|
|
pass
|
|
|
|
mapper(T1, t1, properties={
|
|
't2s':relationship(T2, backref='t1')
|
|
})
|
|
mapper(T2, t2)
|
|
|
|
@classmethod
|
|
def teardown_class(cls):
|
|
metadata.drop_all()
|
|
clear_mappers()
|
|
|
|
@profiling.profiled('clean', report=True)
|
|
def test_session_clean(self):
|
|
for x in range(0, ITERATIONS):
|
|
sess = create_session()
|
|
t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
|
|
for index in [2, 7, 12, 15, 18, 20]:
|
|
t1s[index].t2s
|
|
|
|
sess.close()
|
|
del sess
|
|
gc_collect()
|
|
|
|
@profiling.profiled('dirty', report=True)
|
|
def test_session_dirty(self):
|
|
for x in range(0, ITERATIONS):
|
|
sess = create_session()
|
|
t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
|
|
|
|
for index in [2, 7, 12, 15, 18, 20]:
|
|
t1s[index].c2 = 'this is some modified text'
|
|
for t2 in t1s[index].t2s:
|
|
t2.c2 = 'this is some modified text'
|
|
|
|
del t1s
|
|
gc_collect()
|
|
|
|
sess.close()
|
|
del sess
|
|
gc_collect()
|
|
|
|
@profiling.profiled('noclose', report=True)
|
|
def test_session_noclose(self):
|
|
for x in range(0, ITERATIONS):
|
|
sess = create_session()
|
|
t1s = sess.query(T1).filter(T1.c1.between(15, 48)).all()
|
|
for index in [2, 7, 12, 15, 18, 20]:
|
|
t1s[index].t2s
|
|
|
|
del sess
|
|
gc_collect()
|
|
|
|
|