summaryrefslogtreecommitdiff
path: root/test/orm
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm')
-rw-r--r--test/orm/_base.py2
-rw-r--r--test/orm/_fixtures.py8
-rw-r--r--test/orm/inheritance/test_abc_inheritance.py4
-rw-r--r--test/orm/inheritance/test_basic.py176
-rw-r--r--test/orm/inheritance/test_concrete.py26
-rw-r--r--test/orm/inheritance/test_magazine.py2
-rw-r--r--test/orm/inheritance/test_polymorph.py26
-rw-r--r--test/orm/inheritance/test_polymorph2.py26
-rw-r--r--test/orm/inheritance/test_query.py244
-rw-r--r--test/orm/inheritance/test_single.py64
-rw-r--r--test/orm/test_assorted_eager.py8
-rw-r--r--test/orm/test_attributes.py160
-rw-r--r--test/orm/test_backref_mutations.py54
-rw-r--r--test/orm/test_cascade.py242
-rw-r--r--test/orm/test_collection.py38
-rw-r--r--test/orm/test_composites.py64
-rw-r--r--test/orm/test_cycles.py67
-rw-r--r--test/orm/test_defaults.py8
-rw-r--r--test/orm/test_deprecations.py18
-rw-r--r--test/orm/test_descriptor.py40
-rw-r--r--test/orm/test_dynamic.py12
-rw-r--r--test/orm/test_eager_relations.py106
-rw-r--r--test/orm/test_evaluator.py16
-rw-r--r--test/orm/test_events.py234
-rw-r--r--test/orm/test_expire.py80
-rw-r--r--test/orm/test_extendedattr.py8
-rw-r--r--test/orm/test_froms.py178
-rw-r--r--test/orm/test_generative.py10
-rw-r--r--test/orm/test_immediate_load.py10
-rw-r--r--test/orm/test_instrumentation.py8
-rw-r--r--test/orm/test_joins.py278
-rw-r--r--test/orm/test_lazy_relations.py12
-rw-r--r--test/orm/test_legacy_mutable.py58
-rw-r--r--test/orm/test_load_on_fks.py80
-rw-r--r--test/orm/test_manytomany.py22
-rw-r--r--test/orm/test_mapper.py202
-rw-r--r--test/orm/test_merge.py110
-rw-r--r--test/orm/test_naturalpks.py116
-rw-r--r--test/orm/test_onetoone.py2
-rw-r--r--test/orm/test_pickled.py52
-rw-r--r--test/orm/test_query.py354
-rw-r--r--test/orm/test_relationships.py188
-rw-r--r--test/orm/test_scoping.py4
-rw-r--r--test/orm/test_selectable.py4
-rw-r--r--test/orm/test_session.py116
-rw-r--r--test/orm/test_subquery_relations.py52
-rw-r--r--test/orm/test_transaction.py40
-rw-r--r--test/orm/test_unitofwork.py114
-rw-r--r--test/orm/test_unitofworkv2.py122
-rw-r--r--test/orm/test_utils.py2
-rw-r--r--test/orm/test_versioning.py49
51 files changed, 1957 insertions, 1959 deletions
diff --git a/test/orm/_base.py b/test/orm/_base.py
index 345009d40..ef1ec33f1 100644
--- a/test/orm/_base.py
+++ b/test/orm/_base.py
@@ -183,7 +183,7 @@ class MappedTest(ORMTest):
if name[0].isupper:
delattr(cls, name)
del cls.classes[name]
-
+
@classmethod
def _load_fixtures(cls):
headers, rows = {}, {}
diff --git a/test/orm/_fixtures.py b/test/orm/_fixtures.py
index 8f128c287..3c7d0aa57 100644
--- a/test/orm/_fixtures.py
+++ b/test/orm/_fixtures.py
@@ -169,7 +169,7 @@ composite_pk_table = fixture_table(
Table('composite_pk_table', fixture_metadata,
Column('i', Integer, primary_key=True),
Column('j', Integer, primary_key=True),
- Column('k', Integer, nullable=False),
+ Column('k', Integer, nullable=False),
),
('i', 'j', 'k'),
(1, 2, 3),
@@ -218,7 +218,7 @@ class Node(Base):
class CompositePk(Base):
pass
-
+
class FixtureTest(_base.MappedTest):
"""A MappedTest pre-configured for fixtures.
@@ -378,7 +378,7 @@ class CannedResults(object):
keywords=[]),
Item(id=5,
keywords=[])]
-
+
@property
def user_item_keyword_result(self):
item1, item2, item3, item4, item5 = \
@@ -420,6 +420,6 @@ class CannedResults(object):
items=[item1, item5])]),
User(id=10, orders=[])]
return user_result
-
+
FixtureTest.static = CannedResults()
diff --git a/test/orm/inheritance/test_abc_inheritance.py b/test/orm/inheritance/test_abc_inheritance.py
index 08ab28a08..d370ec9cb 100644
--- a/test/orm/inheritance/test_abc_inheritance.py
+++ b/test/orm/inheritance/test_abc_inheritance.py
@@ -11,9 +11,9 @@ def produce_test(parent, child, direction):
"""produce a testcase for A->B->C inheritance with a self-referential
relationship between two of the classes, using either one-to-many or
many-to-one.
-
+
the old "no discriminator column" pattern is used.
-
+
"""
class ABCTest(_base.MappedTest):
@classmethod
diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py
index 095434999..df7958b2f 100644
--- a/test/orm/inheritance/test_basic.py
+++ b/test/orm/inheritance/test_basic.py
@@ -84,7 +84,7 @@ class PolymorphicOnNotLocalTest(_base.MappedTest):
Column('id', Integer, primary_key=True),
Column('y', String(10)),
Column('xid', ForeignKey('t1.id')))
-
+
@testing.resolve_artifact_names
def test_bad_polymorphic_on(self):
class InterfaceBase(object):
@@ -126,8 +126,8 @@ class PolymorphicOnNotLocalTest(_base.MappedTest):
"polymorphic loads will not function properly",
go
)
-
-
+
+
class FalseDiscriminatorTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -135,7 +135,7 @@ class FalseDiscriminatorTest(_base.MappedTest):
t1 = Table('t1', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('type', Boolean, nullable=False))
-
+
def test_false_on_sub(self):
class Foo(object):pass
class Bar(Foo):pass
@@ -161,7 +161,7 @@ class FalseDiscriminatorTest(_base.MappedTest):
assert d1.type is False
sess.expunge_all()
assert sess.query(Ding).one() is not None
-
+
class PolymorphicSynonymTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -175,7 +175,7 @@ class PolymorphicSynonymTest(_base.MappedTest):
Column('id', Integer, ForeignKey('t1.id'),
primary_key=True),
Column('data', String(10), nullable=False))
-
+
def test_polymorphic_synonym(self):
class T1(_fixtures.Base):
def info(self):
@@ -183,9 +183,9 @@ class PolymorphicSynonymTest(_base.MappedTest):
def _set_info(self, x):
self._info = x
info = property(info, _set_info)
-
+
class T2(T1):pass
-
+
mapper(T1, t1, polymorphic_on=t1.c.type, polymorphic_identity='t1',
properties={
'info':synonym('_info', map_column=True)
@@ -200,12 +200,12 @@ class PolymorphicSynonymTest(_base.MappedTest):
sess.expunge_all()
eq_(sess.query(T2).filter(T2.info=='at2').one(), at2)
eq_(at2.info, "THE INFO IS:at2")
-
+
class PolymorphicAttributeManagementTest(_base.MappedTest):
"""Test polymorphic_on can be assigned, can be mirrored, etc."""
run_setup_mappers = 'once'
-
+
@classmethod
def define_tables(cls, metadata):
Table('table_a', metadata,
@@ -222,7 +222,7 @@ class PolymorphicAttributeManagementTest(_base.MappedTest):
Column('id', Integer, ForeignKey('table_b.id'),
primary_key=True)
)
-
+
@classmethod
@testing.resolve_artifact_names
def setup_classes(cls):
@@ -232,7 +232,7 @@ class PolymorphicAttributeManagementTest(_base.MappedTest):
pass
class C(B):
pass
-
+
mapper(A, table_a,
polymorphic_on=table_a.c.class_name,
polymorphic_identity='a')
@@ -241,7 +241,7 @@ class PolymorphicAttributeManagementTest(_base.MappedTest):
polymorphic_identity='b')
mapper(C, table_c, inherits=B,
polymorphic_identity='c')
-
+
@testing.resolve_artifact_names
def test_poly_configured_immediate(self):
a = A()
@@ -250,7 +250,7 @@ class PolymorphicAttributeManagementTest(_base.MappedTest):
eq_(a.class_name, 'a')
eq_(b.class_name, 'b')
eq_(c.class_name, 'c')
-
+
@testing.resolve_artifact_names
def test_base_class(self):
sess = Session()
@@ -273,7 +273,7 @@ class PolymorphicAttributeManagementTest(_base.MappedTest):
sess.commit()
sess.close()
assert isinstance(sess.query(B).first(), C)
-
+
class CascadeTest(_base.MappedTest):
"""that cascades on polymorphic relationships continue
cascading along the path of the instance's mapper, not
@@ -378,13 +378,13 @@ class M2OUseGetTest(_base.MappedTest):
# the 'primaryjoin' looks just like "Sub"'s "get" clause (based on the Base id),
# and foreign_keys since that join condition doesn't actually have any fks in it
#'sub':relationship(Sub, primaryjoin=base.c.id==related.c.sub_id, foreign_keys=related.c.sub_id)
-
+
# now we can use this:
'sub':relationship(Sub)
})
-
+
assert class_mapper(Related).get_property('sub').strategy.use_get
-
+
sess = create_session()
s1 = Sub()
r1 = Related(sub=s1)
@@ -397,7 +397,7 @@ class M2OUseGetTest(_base.MappedTest):
def go():
assert r1.sub
self.assert_sql_count(testing.db, go, 0)
-
+
class GetTest(_base.MappedTest):
@classmethod
@@ -417,7 +417,7 @@ class GetTest(_base.MappedTest):
Column('foo_id', Integer, ForeignKey('foo.id')),
Column('bar_id', Integer, ForeignKey('bar.id')),
Column('data', String(20)))
-
+
@classmethod
def setup_classes(cls):
class Foo(_base.BasicEntity):
@@ -431,7 +431,7 @@ class GetTest(_base.MappedTest):
def test_get_polymorphic(self):
self._do_get_test(True)
-
+
def test_get_nonpolymorphic(self):
self._do_get_test(False)
@@ -469,7 +469,7 @@ class GetTest(_base.MappedTest):
assert sess.query(Blub).get(f.id) is None
assert sess.query(Blub).get(b.id) is None
assert sess.query(Bar).get(f.id) is None
-
+
self.assert_sql_count(testing.db, go, 0)
else:
# this is testing the 'wrong' behavior of using get()
@@ -498,7 +498,7 @@ class GetTest(_base.MappedTest):
class EagerLazyTest(_base.MappedTest):
"""tests eager load/lazy load of child items off inheritance mappers, tests that
LazyLoader constructs the right query condition."""
-
+
@classmethod
def define_tables(cls, metadata):
global foo, bar, bar_foo
@@ -544,7 +544,7 @@ class EagerLazyTest(_base.MappedTest):
class EagerTargetingTest(_base.MappedTest):
"""test a scenario where joined table inheritance might be
confused as an eagerly loaded joined table."""
-
+
@classmethod
def define_tables(cls, metadata):
Table('a_table', metadata,
@@ -558,14 +558,14 @@ class EagerTargetingTest(_base.MappedTest):
Column('id', Integer, ForeignKey('a_table.id'), primary_key=True),
Column('b_data', String(50)),
)
-
+
@testing.resolve_artifact_names
def test_adapt_stringency(self):
class A(_base.ComparableEntity):
pass
class B(A):
pass
-
+
mapper(A, a_table, polymorphic_on=a_table.c.type, polymorphic_identity='A',
properties={
'children': relationship(A, order_by=a_table.c.name)
@@ -574,7 +574,7 @@ class EagerTargetingTest(_base.MappedTest):
mapper(B, b_table, inherits=A, polymorphic_identity='B', properties={
'b_derived':column_property(b_table.c.b_data + "DATA")
})
-
+
sess=create_session()
b1=B(id=1, name='b1',b_data='i')
@@ -591,15 +591,15 @@ class EagerTargetingTest(_base.MappedTest):
node = sess.query(B).filter(B.id==bid).all()[0]
eq_(node, B(id=1, name='b1',b_data='i'))
eq_(node.children[0], B(id=2, name='b2',b_data='l'))
-
+
sess.expunge_all()
node = sess.query(B).options(joinedload(B.children)).filter(B.id==bid).all()[0]
eq_(node, B(id=1, name='b1',b_data='i'))
eq_(node.children[0], B(id=2, name='b2',b_data='l'))
-
+
class FlushTest(_base.MappedTest):
"""test dependency sorting among inheriting mappers"""
-
+
@classmethod
def define_tables(cls, metadata):
Table('users', metadata,
@@ -802,7 +802,7 @@ class VersioningTest(_base.MappedTest):
class DistinctPKTest(_base.MappedTest):
"""test the construction of mapper.primary_key when an inheriting relationship
joins on a column other than primary key column."""
-
+
run_inserts = 'once'
run_deletes = None
@@ -886,7 +886,7 @@ class DistinctPKTest(_base.MappedTest):
class SyncCompileTest(_base.MappedTest):
"""test that syncrules compile properly on custom inherit conds"""
-
+
@classmethod
def define_tables(cls, metadata):
global _a_table, _b_table, _c_table
@@ -955,17 +955,17 @@ class SyncCompileTest(_base.MappedTest):
class OverrideColKeyTest(_base.MappedTest):
"""test overriding of column attributes."""
-
+
@classmethod
def define_tables(cls, metadata):
global base, subtable
-
+
base = Table('base', metadata,
Column('base_id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('data', String(255)),
Column('sqlite_fixer', String(10))
)
-
+
subtable = Table('subtable', metadata,
Column('base_id', Integer, ForeignKey('base.base_id'), primary_key=True),
Column('subdata', String(255))
@@ -980,7 +980,7 @@ class OverrideColKeyTest(_base.MappedTest):
mapper(Base, base)
mapper(Sub, subtable, inherits=Base)
-
+
# Sub gets a "base_id" property using the "base_id"
# column of both tables.
eq_(
@@ -992,12 +992,12 @@ class OverrideColKeyTest(_base.MappedTest):
# this pattern is what you see when using declarative
# in particular, here we do a "manual" version of
# what we'd like the mapper to do.
-
+
class Base(object):
pass
class Sub(Base):
pass
-
+
mapper(Base, base, properties={
'id':base.c.base_id
})
@@ -1018,7 +1018,7 @@ class OverrideColKeyTest(_base.MappedTest):
sess.add(s1)
sess.flush()
assert sess.query(Sub).get(10) is s1
-
+
def test_override_onlyinparent(self):
class Base(object):
pass
@@ -1029,7 +1029,7 @@ class OverrideColKeyTest(_base.MappedTest):
'id':base.c.base_id
})
mapper(Sub, subtable, inherits=Base)
-
+
eq_(
class_mapper(Sub).get_property('id').columns,
[base.c.base_id]
@@ -1039,28 +1039,28 @@ class OverrideColKeyTest(_base.MappedTest):
class_mapper(Sub).get_property('base_id').columns,
[subtable.c.base_id]
)
-
+
s1 = Sub()
s1.id = 10
-
+
s2 = Sub()
s2.base_id = 15
-
+
sess = create_session()
sess.add_all([s1, s2])
sess.flush()
-
+
# s1 gets '10'
assert sess.query(Sub).get(10) is s1
-
+
# s2 gets a new id, base_id is overwritten by the ultimate
# PK col
assert s2.id == s2.base_id != 15
-
+
def test_override_implicit(self):
# this is originally [ticket:1111].
# the pattern here is now disallowed by [ticket:1892]
-
+
class Base(object):
pass
class Sub(Base):
@@ -1069,7 +1069,7 @@ class OverrideColKeyTest(_base.MappedTest):
mapper(Base, base, properties={
'id':base.c.base_id
})
-
+
def go():
mapper(Sub, subtable, inherits=Base, properties={
'id':subtable.c.base_id
@@ -1082,7 +1082,7 @@ class OverrideColKeyTest(_base.MappedTest):
def test_plain_descriptor(self):
"""test that descriptors prevent inheritance from propigating properties to subclasses."""
-
+
class Base(object):
pass
class Sub(Base):
@@ -1092,7 +1092,7 @@ class OverrideColKeyTest(_base.MappedTest):
mapper(Base, base)
mapper(Sub, subtable, inherits=Base)
-
+
s1 = Sub()
sess = create_session()
sess.add(s1)
@@ -1107,7 +1107,7 @@ class OverrideColKeyTest(_base.MappedTest):
if instance is None:
return self
return "im the data"
-
+
class Base(object):
pass
class Sub(Base):
@@ -1121,7 +1121,7 @@ class OverrideColKeyTest(_base.MappedTest):
sess.add(s1)
sess.flush()
assert sess.query(Sub).one().data == "im the data"
-
+
def test_sub_columns_over_base_descriptors(self):
class Base(object):
@property
@@ -1133,7 +1133,7 @@ class OverrideColKeyTest(_base.MappedTest):
mapper(Base, base)
mapper(Sub, subtable, inherits=Base)
-
+
sess = create_session()
b1 = Base()
assert b1.subdata == "this is base"
@@ -1144,7 +1144,7 @@ class OverrideColKeyTest(_base.MappedTest):
sess.add_all([s1, b1])
sess.flush()
sess.expunge_all()
-
+
assert sess.query(Base).get(b1.base_id).subdata == "this is base"
assert sess.query(Sub).get(s1.base_id).subdata == "this is sub"
@@ -1175,7 +1175,7 @@ class OverrideColKeyTest(_base.MappedTest):
class OptimizedLoadTest(_base.MappedTest):
"""tests for the "optimized load" routine."""
-
+
@classmethod
def define_tables(cls, metadata):
Table('base', metadata,
@@ -1199,19 +1199,19 @@ class OptimizedLoadTest(_base.MappedTest):
Column('a', String(10)),
Column('b', String(10))
)
-
+
@testing.resolve_artifact_names
def test_optimized_passes(self):
""""test that the 'optimized load' routine doesn't crash when
a column in the join condition is not available."""
-
+
class Base(_base.BasicEntity):
pass
class Sub(Base):
pass
-
+
mapper(Base, base, polymorphic_on=base.c.type, polymorphic_identity='base')
-
+
# redefine Sub's "id" to favor the "id" col in the subtable.
# "id" is also part of the primary join condition
mapper(Sub, sub, inherits=Base,
@@ -1222,7 +1222,7 @@ class OptimizedLoadTest(_base.MappedTest):
sess.add(s1)
sess.commit()
sess.expunge_all()
-
+
# load s1 via Base. s1.id won't populate since it's relative to
# the "sub" table. The optimized load kicks in and tries to
# generate on the primary join, but cannot since "id" is itself unloaded.
@@ -1307,7 +1307,7 @@ class OptimizedLoadTest(_base.MappedTest):
assert s2test.comp
eq_(s1test.comp, Comp('ham', 'cheese'))
eq_(s2test.comp, Comp('bacon', 'eggs'))
-
+
@testing.resolve_artifact_names
def test_load_expired_on_pending(self):
class Base(_base.ComparableEntity):
@@ -1343,7 +1343,7 @@ class OptimizedLoadTest(_base.MappedTest):
lambda ctx:{u'param_1': s1.id}
),
)
-
+
@testing.resolve_artifact_names
def test_dont_generate_on_none(self):
class Base(_base.ComparableEntity):
@@ -1353,23 +1353,23 @@ class OptimizedLoadTest(_base.MappedTest):
mapper(Base, base, polymorphic_on=base.c.type,
polymorphic_identity='base')
m = mapper(Sub, sub, inherits=Base, polymorphic_identity='sub')
-
+
s1 = Sub()
assert m._optimized_get_statement(attributes.instance_state(s1),
['counter2']) is None
-
+
# loads s1.id as None
eq_(s1.id, None)
-
+
# this now will come up with a value of None for id - should reject
assert m._optimized_get_statement(attributes.instance_state(s1),
['counter2']) is None
-
+
s1.id = 1
attributes.instance_state(s1).commit_all(s1.__dict__, None)
assert m._optimized_get_statement(attributes.instance_state(s1),
['counter2']) is not None
-
+
@testing.resolve_artifact_names
def test_load_expired_on_pending_twolevel(self):
class Base(_base.ComparableEntity):
@@ -1378,7 +1378,7 @@ class OptimizedLoadTest(_base.MappedTest):
pass
class SubSub(Sub):
pass
-
+
mapper(Base, base, polymorphic_on=base.c.type,
polymorphic_identity='base')
mapper(Sub, sub, inherits=Base, polymorphic_identity='sub')
@@ -1419,7 +1419,7 @@ class OptimizedLoadTest(_base.MappedTest):
lambda ctx:{u'param_1': s1.id}
),
)
-
+
class PKDiscriminatorTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -1427,7 +1427,7 @@ class PKDiscriminatorTest(_base.MappedTest):
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
Column('name', String(60)))
-
+
children = Table('children', metadata,
Column('id', Integer, ForeignKey('parents.id'),
primary_key=True),
@@ -1446,13 +1446,13 @@ class PKDiscriminatorTest(_base.MappedTest):
class A(Child):
pass
-
+
mapper(Parent, parents, properties={
'children': relationship(Child, backref='parent'),
})
mapper(Child, children, polymorphic_on=children.c.type,
polymorphic_identity=1)
-
+
mapper(A, inherits=Child, polymorphic_identity=2)
s = create_session()
@@ -1464,26 +1464,26 @@ class PKDiscriminatorTest(_base.MappedTest):
assert a.id
assert a.type == 2
-
+
p.name='p1new'
a.name='a1new'
s.flush()
-
+
s.expire_all()
assert a.name=='a1new'
assert p.name=='p1new'
-
-
+
+
class DeleteOrphanTest(_base.MappedTest):
"""Test the fairly obvious, that an error is raised
when attempting to insert an orphan.
-
+
Previous SQLA versions would check this constraint
in memory which is the original rationale for this test.
-
+
"""
-
-
+
+
@classmethod
def define_tables(cls, metadata):
global single, parent
@@ -1493,31 +1493,31 @@ class DeleteOrphanTest(_base.MappedTest):
Column('data', String(50)),
Column('parent_id', Integer, ForeignKey('parent.id'), nullable=False),
)
-
+
parent = Table('parent', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('data', String(50))
)
-
+
def test_orphan_message(self):
class Base(_fixtures.Base):
pass
-
+
class SubClass(Base):
pass
-
+
class Parent(_fixtures.Base):
pass
-
+
mapper(Base, single, polymorphic_on=single.c.type, polymorphic_identity='base')
mapper(SubClass, inherits=Base, polymorphic_identity='sub')
mapper(Parent, parent, properties={
'related':relationship(Base, cascade="all, delete-orphan")
})
-
+
sess = create_session()
s1 = SubClass(data='s1')
sess.add(s1)
assert_raises(sa_exc.DBAPIError, sess.flush)
-
-
+
+
diff --git a/test/orm/inheritance/test_concrete.py b/test/orm/inheritance/test_concrete.py
index 9db095d92..4e20e7a78 100644
--- a/test/orm/inheritance/test_concrete.py
+++ b/test/orm/inheritance/test_concrete.py
@@ -371,7 +371,7 @@ class ConcreteTest(_base.MappedTest):
self.assert_sql_count(testing.db, go, 1)
-
+
class PropertyInheritanceTest(_base.MappedTest):
@classmethod
@@ -389,7 +389,7 @@ class PropertyInheritanceTest(_base.MappedTest):
primary_key=True, test_needs_autoincrement=True),
Column('some_dest_id', Integer, ForeignKey('dest_table.id')),
Column('cname', String(50)))
-
+
Table('dest_table', metadata, Column('id', Integer,
primary_key=True, test_needs_autoincrement=True),
Column('name', String(50)))
@@ -402,10 +402,10 @@ class PropertyInheritanceTest(_base.MappedTest):
class B(A):
pass
-
+
class C(A):
pass
-
+
class Dest(_base.ComparableEntity):
pass
@@ -418,14 +418,14 @@ class PropertyInheritanceTest(_base.MappedTest):
dest = Dest()
assert_raises(AttributeError, setattr, b, 'some_dest', dest)
clear_mappers()
-
+
mapper(A, a_table, properties={'a_id': a_table.c.id})
mapper(B, b_table, inherits=A, concrete=True)
mapper(Dest, dest_table)
b = B()
assert_raises(AttributeError, setattr, b, 'a_id', 3)
clear_mappers()
-
+
mapper(A, a_table, properties={'a_id': a_table.c.id})
mapper(B, b_table, inherits=A, concrete=True)
mapper(Dest, dest_table)
@@ -439,7 +439,7 @@ class PropertyInheritanceTest(_base.MappedTest):
properties={
'some_dest': relationship(Dest, back_populates='many_b')
})
-
+
mapper(Dest, dest_table, properties={
'many_a': relationship(A,back_populates='some_dest'),
'many_b': relationship(B,back_populates='some_dest')
@@ -500,14 +500,14 @@ class PropertyInheritanceTest(_base.MappedTest):
properties={
'some_dest': relationship(Dest, back_populates='many_a')},
)
-
+
mapper(Dest, dest_table, properties={
'many_a': relationship(A,
back_populates='some_dest',
order_by=ajoin.c.id)
}
)
-
+
sess = sessionmaker()()
dest1 = Dest(name='c1')
dest2 = Dest(name='c2')
@@ -517,12 +517,12 @@ class PropertyInheritanceTest(_base.MappedTest):
b2 = B(some_dest=dest1, bname='b2', id=4)
c1 = C(some_dest=dest1, cname='c1', id=5)
c2 = C(some_dest=dest2, cname='c2', id=6)
-
+
eq_([a2, c2], dest2.many_a)
eq_([a1, b1, b2, c1], dest1.many_a)
sess.add_all([dest1, dest2])
sess.commit()
-
+
assert sess.query(Dest).filter(Dest.many_a.contains(a2)).one() is dest2
assert sess.query(Dest).filter(Dest.many_a.contains(b1)).one() is dest1
assert sess.query(Dest).filter(Dest.many_a.contains(c2)).one() is dest2
@@ -576,7 +576,7 @@ class PropertyInheritanceTest(_base.MappedTest):
properties={
'some_dest': relationship(Dest, back_populates='many_a')},
)
-
+
mapper(Dest, dest_table, properties={
'many_a': relationship(A,
back_populates='some_dest',
@@ -596,7 +596,7 @@ class PropertyInheritanceTest(_base.MappedTest):
c1 = C(some_dest=dest2, cname='c1')
sess.add_all([dest1, dest2, c1, a1, b1])
sess.commit()
-
+
sess2 = sessionmaker()()
merged_c1 = sess2.merge(c1)
eq_(merged_c1.some_dest.name, 'd2')
diff --git a/test/orm/inheritance/test_magazine.py b/test/orm/inheritance/test_magazine.py
index e38a1ec33..868bbdcfc 100644
--- a/test/orm/inheritance/test_magazine.py
+++ b/test/orm/inheritance/test_magazine.py
@@ -198,7 +198,7 @@ def generate_round_trip_test(use_unions=False, use_joins=False):
page3 = ClassifiedPage(magazine=magazine,page_no=3)
session.add(pub)
-
+
session.flush()
print [x for x in session]
session.expunge_all()
diff --git a/test/orm/inheritance/test_polymorph.py b/test/orm/inheritance/test_polymorph.py
index 7e31c476b..9cc58af92 100644
--- a/test/orm/inheritance/test_polymorph.py
+++ b/test/orm/inheritance/test_polymorph.py
@@ -123,7 +123,7 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
'engineer':people.join(engineers),
'manager':people.join(managers),
}, None, 'pjoin')
-
+
manager_join = people.join(managers).outerjoin(boss)
person_with_polymorphic = ['*', person_join]
manager_with_polymorphic = ['*', manager_join]
@@ -178,11 +178,11 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
Engineer(status='CGG', engineer_name='engineer2', primary_language='python', **{person_attribute_name:'wally'}),
Manager(status='ABA', manager_name='manager2', **{person_attribute_name:'jsmith'})
]
-
+
pointy = employees[0]
jsmith = employees[-1]
dilbert = employees[1]
-
+
session = create_session()
c = Company(name='company1')
c.employees = employees
@@ -190,7 +190,7 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
session.flush()
session.expunge_all()
-
+
eq_(session.query(Person).get(dilbert.person_id), dilbert)
session.expunge_all()
@@ -200,7 +200,7 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
def go():
cc = session.query(Company).get(c.company_id)
eq_(cc.employees, employees)
-
+
if not lazy_relationship:
if with_polymorphic != 'none':
self.assert_sql_count(testing.db, go, 1)
@@ -212,7 +212,7 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
self.assert_sql_count(testing.db, go, 2)
else:
self.assert_sql_count(testing.db, go, 6)
-
+
# test selecting from the query, using the base mapped table (people) as the selection criterion.
# in the case of the polymorphic Person query, the "people" selectable should be adapted to be "person_join"
eq_(
@@ -226,7 +226,7 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
session.query(Engineer).filter(getattr(Person, person_attribute_name)=='dilbert').first(),
dilbert
)
-
+
# test selecting from the query, joining against an alias of the base "people" table. test that
# the "palias" alias does *not* get sucked up into the "person_join" conversion.
palias = people.alias("palias")
@@ -235,12 +235,12 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
assert dilbert is session.query(Engineer).filter((palias.c.name=='dilbert') & (palias.c.person_id==Person.person_id)).first()
assert dilbert is session.query(Person).filter((Engineer.engineer_name=="engineer1") & (engineers.c.person_id==people.c.person_id)).first()
assert dilbert is session.query(Engineer).filter(Engineer.engineer_name=="engineer1")[0]
-
+
dilbert.engineer_name = 'hes dibert!'
session.flush()
session.expunge_all()
-
+
def go():
session.query(Person).filter(getattr(Person, person_attribute_name)=='dilbert').first()
self.assert_sql_count(testing.db, go, 1)
@@ -255,7 +255,7 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
daboss = Boss(status='BBB', manager_name='boss', golf_swing='fore', **{person_attribute_name:'daboss'})
session.add(daboss)
assert_raises(sa_exc.DBAPIError, session.flush)
-
+
c = session.query(Company).first()
daboss.company = c
manager_list = [e for e in c.employees if isinstance(e, Manager)]
@@ -264,12 +264,12 @@ def _generate_round_trip_test(include_base, lazy_relationship, redefine_colprop,
eq_(session.query(Manager).order_by(Manager.person_id).all(), manager_list)
c = session.query(Company).first()
-
+
session.delete(c)
session.flush()
-
+
eq_(people.count().scalar(), 0)
-
+
test_roundtrip = function_named(
test_roundtrip, "test_%s%s%s_%s" % (
(lazy_relationship and "lazy" or "eager"),
diff --git a/test/orm/inheritance/test_polymorph2.py b/test/orm/inheritance/test_polymorph2.py
index 2a9341692..92af79ae1 100644
--- a/test/orm/inheritance/test_polymorph2.py
+++ b/test/orm/inheritance/test_polymorph2.py
@@ -47,9 +47,9 @@ class RelationshipTest1(_base.MappedTest):
pass
class Manager(Person):
pass
-
+
# note that up until recently (0.4.4), we had to specify "foreign_keys" here
- # for this primary join.
+ # for this primary join.
mapper(Person, people, properties={
'manager':relationship(Manager, primaryjoin=(people.c.manager_id ==
managers.c.person_id),
@@ -57,9 +57,9 @@ class RelationshipTest1(_base.MappedTest):
})
mapper(Manager, managers, inherits=Person,
inherit_condition=people.c.person_id==managers.c.person_id)
-
+
eq_(class_mapper(Person).get_property('manager').synchronize_pairs, [(managers.c.person_id,people.c.manager_id)])
-
+
session = create_session()
p = Person(name='some person')
m = Manager(name='some manager')
@@ -382,7 +382,7 @@ class RelationshipTest4(_base.MappedTest):
session.flush()
session.expunge_all()
-
+
def go():
testcar = session.query(Car).options(joinedload('employee')).get(car1.car_id)
assert str(testcar.employee) == "Engineer E4, status X"
@@ -661,13 +661,13 @@ class RelationshipTest8(_base.MappedTest):
sess = create_session()
sess.add(t1)
sess.flush()
-
+
sess.expunge_all()
eq_(
sess.query(Taggable).order_by(Taggable.id).all(),
[User(data='u1'), Taggable(owner=User(data='u1'))]
)
-
+
class GenerativeTest(TestBase, AssertsExecutionResults):
@classmethod
def setup_class(cls):
@@ -787,7 +787,7 @@ class GenerativeTest(TestBase, AssertsExecutionResults):
# added here for testing
e = exists([Car.owner], Car.owner==employee_join.c.person_id)
Query(Person)._adapt_clause(employee_join, False, False)
-
+
r = session.query(Person).filter(Person.name.like('%2')).join('status').filter_by(name="active").order_by(Person.person_id)
eq_(str(list(r)), "[Manager M2, category YYYYYYYYY, status Status active, Engineer E2, field X, status Status active]")
r = session.query(Engineer).join('status').filter(Person.name.in_(['E2', 'E3', 'E4', 'M4', 'M2', 'M1']) & (status.c.name=="active")).order_by(Person.name)
@@ -1092,7 +1092,7 @@ class MissingPolymorphicOnTest(_base.MappedTest):
Column('id', Integer, ForeignKey('tablec.id'), primary_key=True),
Column('ddata', String(50)),
)
-
+
def test_polyon_col_setsup(self):
class A(_fixtures.Base):
pass
@@ -1102,16 +1102,16 @@ class MissingPolymorphicOnTest(_base.MappedTest):
pass
class D(C):
pass
-
+
poly_select = select([tablea, tableb.c.data.label('discriminator')], from_obj=tablea.join(tableb)).alias('poly')
-
+
mapper(B, tableb)
mapper(A, tablea, with_polymorphic=('*', poly_select), polymorphic_on=poly_select.c.discriminator, properties={
'b':relationship(B, uselist=False)
})
mapper(C, tablec, inherits=A,polymorphic_identity='c')
mapper(D, tabled, inherits=C, polymorphic_identity='d')
-
+
c = C(cdata='c1', adata='a1', b=B(data='c'))
d = D(cdata='c2', adata='a2', ddata='d2', b=B(data='d'))
sess = create_session()
@@ -1120,4 +1120,4 @@ class MissingPolymorphicOnTest(_base.MappedTest):
sess.flush()
sess.expunge_all()
eq_(sess.query(A).all(), [C(cdata='c1', adata='a1'), D(cdata='c2', adata='a2', ddata='d2')])
-
+
diff --git a/test/orm/inheritance/test_query.py b/test/orm/inheritance/test_query.py
index 36a23204d..61727eb4e 100644
--- a/test/orm/inheritance/test_query.py
+++ b/test/orm/inheritance/test_query.py
@@ -25,7 +25,7 @@ class Boss(Manager):
class Machine(_fixtures.Base):
pass
-
+
class Paperwork(_fixtures.Base):
pass
@@ -34,7 +34,7 @@ def _produce_test(select_type):
run_inserts = 'once'
run_setup_mappers = 'once'
run_deletes = None
-
+
@classmethod
def define_tables(cls, metadata):
global companies, people, engineers, managers, boss, paperwork, machines
@@ -55,12 +55,12 @@ def _produce_test(select_type):
Column('engineer_name', String(50)),
Column('primary_language', String(50)),
)
-
+
machines = Table('machines', metadata,
Column('machine_id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('name', String(50)),
Column('engineer_id', Integer, ForeignKey('engineers.person_id')))
-
+
managers = Table('managers', metadata,
Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True),
Column('status', String(30)),
@@ -78,7 +78,7 @@ def _produce_test(select_type):
Column('person_id', Integer, ForeignKey('people.person_id')))
clear_mappers()
-
+
mapper(Company, companies, properties={
'employees':relationship(Person, order_by=people.c.person_id)
})
@@ -129,7 +129,7 @@ def _produce_test(select_type):
inherits=Person, polymorphic_identity='manager')
mapper(Boss, boss, inherits=Manager, polymorphic_identity='boss')
mapper(Paperwork, paperwork)
-
+
@classmethod
def insert_data(cls):
@@ -165,7 +165,7 @@ def _produce_test(select_type):
Machine(name="Commodore 64"),
Machine(name="IBM 3270")
])
-
+
c2.employees = [e3]
sess = create_session()
sess.add(c1)
@@ -176,10 +176,10 @@ def _produce_test(select_type):
all_employees = [e1, e2, b1, m1, e3]
c1_employees = [e1, e2, b1, m1]
c2_employees = [e3]
-
+
def test_loads_at_once(self):
"""test that all objects load from the full query, when with_polymorphic is used"""
-
+
sess = create_session()
def go():
eq_(sess.query(Person).all(), all_employees)
@@ -187,7 +187,7 @@ def _produce_test(select_type):
def test_foo(self):
sess = create_session()
-
+
def go():
eq_(sess.query(Person).options(subqueryload(Engineer.machines)).all(), all_employees)
self.assert_sql_count(testing.db, go, {'':14, 'Unions':8, 'Polymorphic':7}.get(select_type, 8))
@@ -197,13 +197,13 @@ def _produce_test(select_type):
# for both joinedload() and subqueryload(), if the original q is not loading
# the subclass table, the joinedload doesn't happen.
-
+
def go():
eq_(sess.query(Person).options(joinedload(Engineer.machines))[1:3], all_employees[1:3])
self.assert_sql_count(testing.db, go, {'':6, 'Polymorphic':3}.get(select_type, 4))
sess = create_session()
-
+
def go():
eq_(sess.query(Person).options(subqueryload(Engineer.machines)).all(), all_employees)
self.assert_sql_count(testing.db, go, {'':14, 'Unions':8, 'Polymorphic':7}.get(select_type, 8))
@@ -220,26 +220,26 @@ def _produce_test(select_type):
options(joinedload(Engineer.machines))[1:3],
all_employees[1:3])
self.assert_sql_count(testing.db, go, 3)
-
-
+
+
def test_get(self):
sess = create_session()
-
+
# for all mappers, ensure the primary key has been calculated as just the "person_id"
# column
eq_(sess.query(Person).get(e1.person_id), Engineer(name="dilbert", primary_language="java"))
eq_(sess.query(Engineer).get(e1.person_id), Engineer(name="dilbert", primary_language="java"))
eq_(sess.query(Manager).get(b1.person_id), Boss(name="pointy haired boss", golf_swing="fore"))
-
+
def test_multi_join(self):
sess = create_session()
e = aliased(Person)
c = aliased(Company)
-
+
q = sess.query(Company, Person, c, e).join(Person, Company.employees).join(e, c.employees).\
filter(Person.name=='dilbert').filter(e.name=='wally')
-
+
eq_(q.count(), 1)
eq_(q.all(), [
(
@@ -249,7 +249,7 @@ def _produce_test(select_type):
Engineer(status=u'regular engineer',engineer_name=u'wally',name=u'wally',company_id=1,primary_language=u'c++',person_id=2,type=u'engineer')
)
])
-
+
def test_filter_on_subclass(self):
sess = create_session()
eq_(sess.query(Engineer).all()[0], Engineer(name="dilbert"))
@@ -261,7 +261,7 @@ def _produce_test(select_type):
eq_(sess.query(Manager).filter(Manager.person_id==m1.person_id).one(), Manager(name="dogbert"))
eq_(sess.query(Manager).filter(Manager.person_id==b1.person_id).one(), Boss(name="pointy haired boss"))
-
+
eq_(sess.query(Boss).filter(Boss.person_id==b1.person_id).one(), Boss(name="pointy haired boss"))
def test_join_from_polymorphic(self):
@@ -288,7 +288,7 @@ def _produce_test(select_type):
sess.expunge_all()
eq_(sess.query(Person).with_polymorphic([Manager, Engineer]).join('paperwork', aliased=aliased).filter(Person.name.like('%dog%')).filter(Paperwork.description.like('%#2%')).all(), [m1])
-
+
def test_join_to_polymorphic(self):
sess = create_session()
eq_(sess.query(Company).join('employees').filter(Person.name=='vlad').one(), c2)
@@ -302,7 +302,7 @@ def _produce_test(select_type):
sess.query(Company).\
filter(Company.employees.any(Person.name=='vlad')).all(), [c2]
)
-
+
# test that the aliasing on "Person" does not bleed into the
# EXISTS clause generated by any()
eq_(
@@ -314,12 +314,12 @@ def _produce_test(select_type):
sess.query(Company).join(Company.employees, aliased=True).filter(Person.name=='dilbert').\
filter(Company.employees.any(Person.name=='vlad')).all(), []
)
-
+
eq_(
sess.query(Company).filter(Company.employees.of_type(Engineer).any(Engineer.primary_language=='cobol')).one(),
c2
)
-
+
calias = aliased(Company)
eq_(
sess.query(calias).filter(calias.employees.of_type(Engineer).any(Engineer.primary_language=='cobol')).one(),
@@ -343,12 +343,12 @@ def _produce_test(select_type):
eq_(
sess.query(Person).filter(Person.paperwork.any(Paperwork.description=="review #2")).all(), [m1]
)
-
+
eq_(
sess.query(Company).filter(Company.employees.of_type(Engineer).any(and_(Engineer.primary_language=='cobol'))).one(),
c2
)
-
+
def test_join_from_columns_or_subclass(self):
sess = create_session()
@@ -356,7 +356,7 @@ def _produce_test(select_type):
sess.query(Manager.name).order_by(Manager.name).all(),
[(u'dogbert',), (u'pointy haired boss',)]
)
-
+
eq_(
sess.query(Manager.name).join(Paperwork, Manager.paperwork).order_by(Manager.name).all(),
[(u'dogbert',), (u'dogbert',), (u'pointy haired boss',)]
@@ -366,20 +366,20 @@ def _produce_test(select_type):
sess.query(Person.name).join(Paperwork, Person.paperwork).order_by(Person.name).all(),
[(u'dilbert',), (u'dilbert',), (u'dogbert',), (u'dogbert',), (u'pointy haired boss',), (u'vlad',), (u'wally',), (u'wally',)]
)
-
+
# Load Person.name, joining from Person -> paperwork, get all
# the people.
eq_(
sess.query(Person.name).join(paperwork, Person.person_id==paperwork.c.person_id).order_by(Person.name).all(),
[(u'dilbert',), (u'dilbert',), (u'dogbert',), (u'dogbert',), (u'pointy haired boss',), (u'vlad',), (u'wally',), (u'wally',)]
)
-
+
# same, on manager. get only managers.
eq_(
sess.query(Manager.name).join(paperwork, Manager.person_id==paperwork.c.person_id).order_by(Person.name).all(),
[(u'dogbert',), (u'dogbert',), (u'pointy haired boss',)]
)
-
+
if select_type == '':
# this now raises, due to [ticket:1892]. Manager.person_id is now the "person_id" column on Manager.
# the SQL is incorrect.
@@ -400,8 +400,8 @@ def _produce_test(select_type):
sess.query(Person.name).join(paperwork, Manager.person_id==paperwork.c.person_id).order_by(Person.name).all(),
[(u'dogbert',), (u'dogbert',), (u'pointy haired boss',)]
)
-
-
+
+
eq_(
sess.query(Manager).join(Paperwork, Manager.paperwork).order_by(Manager.name).all(),
[m1, b1]
@@ -416,7 +416,7 @@ def _produce_test(select_type):
sess.query(Manager.person_id).join(paperwork, Manager.person_id==paperwork.c.person_id).order_by(Manager.name).all(),
[(4,), (4,), (3,)]
)
-
+
eq_(
sess.query(Manager.name, Paperwork.description).
join(Paperwork, Manager.person_id==Paperwork.person_id).
@@ -424,41 +424,41 @@ def _produce_test(select_type):
all(),
[(u'pointy haired boss', u'review #1'), (u'dogbert', u'review #2'), (u'dogbert', u'review #3')]
)
-
+
malias = aliased(Manager)
eq_(
sess.query(malias.name).join(paperwork, malias.person_id==paperwork.c.person_id).all(),
[(u'pointy haired boss',), (u'dogbert',), (u'dogbert',)]
)
-
+
def test_polymorphic_option(self):
"""test that polymorphic loading sets state.load_path with its actual mapper
on a subclass, and not the superclass mapper.
-
+
"""
paths = []
class MyOption(interfaces.MapperOption):
propagate_to_loaders = True
def process_query_conditionally(self, query):
paths.append(query._current_path)
-
+
sess = create_session()
dilbert, boss = sess.query(Person).\
options(MyOption()).\
filter(Person.name.in_(['dilbert', 'pointy haired boss'])).\
order_by(Person.name).\
all()
-
+
dilbert.machines
boss.paperwork
eq_(paths,
[(class_mapper(Engineer), 'machines'),
(class_mapper(Boss), 'paperwork')])
-
-
+
+
def test_expire(self):
"""test that individual column refresh doesn't get tripped up by the select_table mapper"""
-
+
sess = create_session()
m1 = sess.query(Manager).filter(Manager.name=='dogbert').one()
sess.expire(m1)
@@ -467,16 +467,16 @@ def _produce_test(select_type):
m2 = sess.query(Manager).filter(Manager.name=='pointy haired boss').one()
sess.expire(m2, ['manager_name', 'golf_swing'])
assert m2.golf_swing=='fore'
-
+
def test_with_polymorphic(self):
-
+
sess = create_session()
-
-
+
+
assert_raises(sa_exc.InvalidRequestError, sess.query(Person).with_polymorphic, Paperwork)
assert_raises(sa_exc.InvalidRequestError, sess.query(Engineer).with_polymorphic, Boss)
assert_raises(sa_exc.InvalidRequestError, sess.query(Engineer).with_polymorphic, Person)
-
+
# compare to entities without related collections to prevent additional lazy SQL from firing on
# loaded entities
emps_without_relationships = [
@@ -487,12 +487,12 @@ def _produce_test(select_type):
Engineer(name="vlad", engineer_name="vlad", primary_language="cobol", status="elbonian engineer")
]
eq_(sess.query(Person).with_polymorphic('*').all(), emps_without_relationships)
-
-
+
+
def go():
eq_(sess.query(Person).with_polymorphic(Engineer).filter(Engineer.primary_language=='java').all(), emps_without_relationships[0:1])
self.assert_sql_count(testing.db, go, 1)
-
+
sess.expunge_all()
def go():
eq_(sess.query(Person).with_polymorphic('*').all(), emps_without_relationships)
@@ -507,13 +507,13 @@ def _produce_test(select_type):
def go():
eq_(sess.query(Person).with_polymorphic(Engineer, people.outerjoin(engineers)).all(), emps_without_relationships)
self.assert_sql_count(testing.db, go, 3)
-
+
sess.expunge_all()
def go():
# limit the polymorphic join down to just "Person", overriding select_table
eq_(sess.query(Person).with_polymorphic(Person).all(), emps_without_relationships)
self.assert_sql_count(testing.db, go, 6)
-
+
def test_relationship_to_polymorphic(self):
assert_result = [
Company(name="MegaCorp, Inc.", employees=[
@@ -528,14 +528,14 @@ def _produce_test(select_type):
Engineer(name="vlad", engineer_name="vlad", primary_language="cobol", status="elbonian engineer")
])
]
-
+
sess = create_session()
-
+
def go():
# test load Companies with lazy load to 'employees'
eq_(sess.query(Company).all(), assert_result)
self.assert_sql_count(testing.db, go, {'':9, 'Polymorphic':4}.get(select_type, 5))
-
+
sess = create_session()
def go():
# currently, it doesn't matter if we say Company.employees,
@@ -546,14 +546,14 @@ def _produce_test(select_type):
joinedload_all(Company.employees.of_type(Engineer), Engineer.machines
)).all(),
assert_result)
-
+
# in the case of select_type='', the joinedload
# doesn't take in this case; it joinedloads company->people,
- # then a load for each of 5 rows, then lazyload of "machines"
+ # then a load for each of 5 rows, then lazyload of "machines"
self.assert_sql_count(testing.db, go,
{'':7, 'Polymorphic':1}.get(select_type, 2)
)
-
+
sess = create_session()
def go():
eq_(
@@ -561,7 +561,7 @@ def _produce_test(select_type):
subqueryload_all(Company.employees.of_type(Engineer), Engineer.machines
)).all(),
assert_result)
-
+
self.assert_sql_count(
testing.db, go,
{'':8,
@@ -570,7 +570,7 @@ def _produce_test(select_type):
'Polymorphic':3,
'AliasedJoins':4}[select_type]
)
-
+
def test_joinedload_on_subclass(self):
sess = create_session()
def go():
@@ -588,7 +588,7 @@ def _produce_test(select_type):
)
self.assert_sql_count(testing.db, go, 2)
-
+
def test_query_subclass_join_to_base_relationship(self):
sess = create_session()
# non-polymorphic
@@ -601,7 +601,7 @@ def _produce_test(select_type):
if select_type == '':
eq_(sess.query(Company).select_from(companies.join(people).join(engineers)).filter(Engineer.primary_language=='java').all(), [c1])
eq_(sess.query(Company).join(people.join(engineers), 'employees').filter(Engineer.primary_language=='java').all(), [c1])
-
+
ealias = aliased(Engineer)
eq_(sess.query(Company).join(ealias, 'employees').filter(ealias.primary_language=='java').all(), [c1])
@@ -616,7 +616,7 @@ def _produce_test(select_type):
eq_(sess.query(Person).join(Engineer.machines).filter(Machine.name.ilike("%ibm%")).all(), [e1, e3])
eq_(sess.query(Company).join('employees', Engineer.machines).all(), [c1, c2])
eq_(sess.query(Company).join('employees', Engineer.machines).filter(Machine.name.ilike("%thinkpad%")).all(), [c1])
-
+
# non-polymorphic
eq_(sess.query(Engineer).join(Engineer.machines).all(), [e1, e2, e3])
eq_(sess.query(Engineer).join(Engineer.machines).filter(Machine.name.ilike("%ibm%")).all(), [e1, e3])
@@ -647,7 +647,7 @@ def _produce_test(select_type):
join('employees', 'paperwork', aliased=aliased).filter(Person.name.in_(['dilbert', 'vlad'])).filter(Paperwork.description.like('%#2%')).all(),
[c1]
)
-
+
eq_(
sess.query(Company).\
join('employees', 'paperwork', aliased=aliased).filter(Person.name.in_(['dilbert', 'vlad'])).filter(Paperwork.description.like('%#%')).all(),
@@ -686,31 +686,31 @@ def _produce_test(select_type):
filter(Engineer.engineer_name=='vlad').one(),
c2
)
-
-
+
+
def test_filter_on_baseclass(self):
sess = create_session()
eq_(sess.query(Person).all(), all_employees)
eq_(sess.query(Person).first(), all_employees[0])
-
+
eq_(sess.query(Person).filter(Person.person_id==e2.person_id).one(), e2)
-
+
def test_from_alias(self):
sess = create_session()
-
+
palias = aliased(Person)
eq_(
sess.query(palias).filter(palias.name.in_(['dilbert', 'wally'])).all(),
[e1, e2]
)
-
+
def test_self_referential(self):
sess = create_session()
-
+
c1_employees = [e1, e2, b1, m1]
-
+
palias = aliased(Person)
eq_(
sess.query(Person, palias).filter(Person.company_id==palias.company_id).filter(Person.name=='dogbert').\
@@ -731,17 +731,17 @@ def _produce_test(select_type):
(m1, b1),
]
)
-
+
def test_nesting_queries(self):
sess = create_session()
-
+
# query.statement places a flag "no_adapt" on the returned statement. This prevents
# the polymorphic adaptation in the second "filter" from hitting it, which would pollute
# the subquery and usually results in recursion overflow errors within the adaption.
subq = sess.query(engineers.c.person_id).filter(Engineer.primary_language=='java').statement.as_scalar()
-
+
eq_(sess.query(Person).filter(Person.person_id==subq).one(), e1)
-
+
def test_mixed_entities(self):
sess = create_session()
@@ -756,8 +756,8 @@ def _produce_test(select_type):
[(Engineer(status=u'elbonian engineer',engineer_name=u'vlad',name=u'vlad',primary_language=u'cobol'),
u'Elbonia, Inc.')]
)
-
-
+
+
eq_(
sess.query(Manager.name).all(),
[('pointy haired boss', ), ('dogbert',)]
@@ -771,7 +771,7 @@ def _produce_test(select_type):
row = sess.query(Engineer.name, Engineer.primary_language).filter(Engineer.name=='dilbert').first()
assert row.name == 'dilbert'
assert row.primary_language == 'java'
-
+
eq_(
sess.query(Engineer.name, Engineer.primary_language).all(),
@@ -782,7 +782,7 @@ def _produce_test(select_type):
sess.query(Boss.name, Boss.golf_swing).all(),
[(u'pointy haired boss', u'fore')]
)
-
+
# TODO: I think raise error on these for now. different inheritance/loading schemes have different
# results here, all incorrect
#
@@ -790,7 +790,7 @@ def _produce_test(select_type):
# sess.query(Person.name, Engineer.primary_language).all(),
# []
# )
-
+
# self.assertEquals(
# sess.query(Person.name, Engineer.primary_language, Manager.manager_name).all(),
# []
@@ -815,7 +815,7 @@ def _produce_test(select_type):
(Engineer(status=u'elbonian engineer',engineer_name=u'vlad',name=u'vlad',company_id=2,primary_language=u'cobol',person_id=5,type=u'engineer'), u'Elbonia, Inc.')
]
)
-
+
eq_(
sess.query(Engineer.primary_language, Company.name).join(Company.employees).filter(Person.type=='engineer').order_by(desc(Engineer.primary_language)).all(),
[(u'java', u'MegaCorp, Inc.'), (u'cobol', u'Elbonia, Inc.'), (u'c++', u'MegaCorp, Inc.')]
@@ -841,7 +841,7 @@ def _produce_test(select_type):
sess.query(Person.name, Company.name, palias.name).join(Company.employees).filter(Company.name=='Elbonia, Inc.').filter(palias.name=='dilbert').all(),
[(u'vlad', u'Elbonia, Inc.', u'dilbert')]
)
-
+
palias = aliased(Person)
eq_(
sess.query(Person.type, Person.name, palias.type, palias.name).filter(Person.company_id==palias.company_id).filter(Person.name=='dogbert').\
@@ -850,7 +850,7 @@ def _produce_test(select_type):
(u'manager', u'dogbert', u'engineer', u'wally'),
(u'manager', u'dogbert', u'boss', u'pointy haired boss')]
)
-
+
eq_(
sess.query(Person.name, Paperwork.description).filter(Person.person_id==Paperwork.person_id).order_by(Person.name, Paperwork.description).all(),
[(u'dilbert', u'tps report #1'), (u'dilbert', u'tps report #2'), (u'dogbert', u'review #2'),
@@ -867,7 +867,7 @@ def _produce_test(select_type):
sess.query(func.count(Person.person_id)).filter(Engineer.primary_language=='java').all(),
[(1, )]
)
-
+
eq_(
sess.query(Company.name, func.count(Person.person_id)).filter(Company.company_id==Person.company_id).group_by(Company.name).order_by(Company.name).all(),
[(u'Elbonia, Inc.', 1), (u'MegaCorp, Inc.', 4)]
@@ -877,20 +877,20 @@ def _produce_test(select_type):
sess.query(Company.name, func.count(Person.person_id)).join(Company.employees).group_by(Company.name).order_by(Company.name).all(),
[(u'Elbonia, Inc.', 1), (u'MegaCorp, Inc.', 4)]
)
-
-
+
+
PolymorphicQueryTest.__name__ = "Polymorphic%sTest" % select_type
return PolymorphicQueryTest
for select_type in ('', 'Polymorphic', 'Unions', 'AliasedJoins', 'Joins'):
testclass = _produce_test(select_type)
exec("%s = testclass" % testclass.__name__)
-
+
del testclass
class SelfReferentialTestJoinedToBase(_base.MappedTest):
run_setup_mappers = 'once'
-
+
@classmethod
def define_tables(cls, metadata):
global people, engineers
@@ -913,9 +913,9 @@ class SelfReferentialTestJoinedToBase(_base.MappedTest):
polymorphic_identity='engineer', properties={
'reports_to':relationship(Person, primaryjoin=people.c.person_id==engineers.c.reports_to_id)
})
-
+
def test_has(self):
-
+
p1 = Person(name='dogbert')
e1 = Engineer(name='dilbert', primary_language='java', reports_to=p1)
sess = create_session()
@@ -923,7 +923,7 @@ class SelfReferentialTestJoinedToBase(_base.MappedTest):
sess.add(e1)
sess.flush()
sess.expunge_all()
-
+
eq_(sess.query(Engineer).filter(Engineer.reports_to.has(Person.name=='dogbert')).first(), Engineer(name='dilbert'))
def test_oftype_aliases_in_exists(self):
@@ -932,9 +932,9 @@ class SelfReferentialTestJoinedToBase(_base.MappedTest):
sess = create_session()
sess.add_all([e1, e2])
sess.flush()
-
+
eq_(sess.query(Engineer).filter(Engineer.reports_to.of_type(Engineer).has(Engineer.name=='dilbert')).first(), e2)
-
+
def test_join(self):
p1 = Person(name='dogbert')
e1 = Engineer(name='dilbert', primary_language='java', reports_to=p1)
@@ -943,7 +943,7 @@ class SelfReferentialTestJoinedToBase(_base.MappedTest):
sess.add(e1)
sess.flush()
sess.expunge_all()
-
+
eq_(
sess.query(Engineer).join('reports_to', aliased=True).filter(Person.name=='dogbert').first(),
Engineer(name='dilbert'))
@@ -964,7 +964,7 @@ class SelfReferentialJ2JTest(_base.MappedTest):
Column('primary_language', String(50)),
Column('reports_to_id', Integer, ForeignKey('managers.person_id'))
)
-
+
managers = Table('managers', metadata,
Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True),
)
@@ -973,7 +973,7 @@ class SelfReferentialJ2JTest(_base.MappedTest):
def setup_mappers(cls):
mapper(Person, people, polymorphic_on=people.c.type, polymorphic_identity='person')
mapper(Manager, managers, inherits=Person, polymorphic_identity='manager')
-
+
mapper(Engineer, engineers, inherits=Person,
polymorphic_identity='engineer', properties={
'reports_to':relationship(Manager, primaryjoin=managers.c.person_id==engineers.c.reports_to_id, backref='engineers')
@@ -1003,7 +1003,7 @@ class SelfReferentialJ2JTest(_base.MappedTest):
eq_(
sess.query(Engineer).join('reports_to', aliased=True).filter(Manager.name=='dogbert').first(),
Engineer(name='dilbert'))
-
+
def test_filter_aliasing(self):
m1 = Manager(name='dogbert')
m2 = Manager(name='foo')
@@ -1033,7 +1033,7 @@ class SelfReferentialJ2JTest(_base.MappedTest):
(m1, e1),
]
)
-
+
def test_relationship_compare(self):
m1 = Manager(name='dogbert')
m2 = Manager(name='foo')
@@ -1059,17 +1059,17 @@ class SelfReferentialJ2JTest(_base.MappedTest):
[m1]
)
-
+
class M2MFilterTest(_base.MappedTest):
run_setup_mappers = 'once'
run_inserts = 'once'
run_deletes = None
-
+
@classmethod
def define_tables(cls, metadata):
global people, engineers, organizations, engineers_to_org
-
+
organizations = Table('organizations', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('name', String(50)),
@@ -1078,7 +1078,7 @@ class M2MFilterTest(_base.MappedTest):
Column('org_id', Integer, ForeignKey('organizations.id')),
Column('engineer_id', Integer, ForeignKey('engineers.person_id')),
)
-
+
people = Table('people', metadata,
Column('person_id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('name', String(50)),
@@ -1094,14 +1094,14 @@ class M2MFilterTest(_base.MappedTest):
global Organization
class Organization(_fixtures.Base):
pass
-
+
mapper(Organization, organizations, properties={
'engineers':relationship(Engineer, secondary=engineers_to_org, backref='organizations')
})
-
+
mapper(Person, people, polymorphic_on=people.c.type, polymorphic_identity='person')
mapper(Engineer, engineers, inherits=Person, polymorphic_identity='engineer')
-
+
@classmethod
def insert_data(cls):
e1 = Engineer(name='e1')
@@ -1110,23 +1110,23 @@ class M2MFilterTest(_base.MappedTest):
e4 = Engineer(name='e4')
org1 = Organization(name='org1', engineers=[e1, e2])
org2 = Organization(name='org2', engineers=[e3, e4])
-
+
sess = create_session()
sess.add(org1)
sess.add(org2)
sess.flush()
-
+
def test_not_contains(self):
sess = create_session()
-
+
e1 = sess.query(Person).filter(Engineer.name=='e1').one()
-
+
# this works
eq_(sess.query(Organization).filter(~Organization.engineers.of_type(Engineer).contains(e1)).all(), [Organization(name='org2')])
# this had a bug
eq_(sess.query(Organization).filter(~Organization.engineers.contains(e1)).all(), [Organization(name='org2')])
-
+
def test_any(self):
sess = create_session()
eq_(sess.query(Organization).filter(Organization.engineers.of_type(Engineer).any(Engineer.name=='e1')).all(), [Organization(name='org1')])
@@ -1134,7 +1134,7 @@ class M2MFilterTest(_base.MappedTest):
class SelfReferentialM2MTest(_base.MappedTest, AssertsCompiledSQL):
run_setup_mappers = 'once'
-
+
@classmethod
def define_tables(cls, metadata):
global Parent, Child1, Child2
@@ -1167,19 +1167,19 @@ class SelfReferentialM2MTest(_base.MappedTest, AssertsCompiledSQL):
uselist = False, backref="right_children"
)
-
+
def test_query_crit(self):
session = create_session()
c11, c12, c13 = Child1(), Child1(), Child1()
c21, c22, c23 = Child2(), Child2(), Child2()
-
+
c11.left_child2 = c22
c12.left_child2 = c22
c13.left_child2 = c23
-
+
session.add_all([c11, c12, c13, c21, c22, c23])
session.flush()
-
+
# test that the join to Child2 doesn't alias Child1 in the select
eq_(
set(session.query(Child1).join(Child1.left_child2)),
@@ -1210,12 +1210,12 @@ class SelfReferentialM2MTest(_base.MappedTest, AssertsCompiledSQL):
def test_eager_join(self):
session = create_session()
-
+
c1 = Child1()
c1.left_child2 = Child2()
session.add(c1)
session.flush()
-
+
q = session.query(Child1).options(joinedload('left_child2'))
# test that the splicing of the join works here, doesnt break in the middle of "parent join child1"
@@ -1233,21 +1233,21 @@ class SelfReferentialM2MTest(_base.MappedTest, AssertsCompiledSQL):
# another way to check
assert q.limit(1).with_labels().subquery().count().scalar() == 1
-
+
assert q.first() is c1
-
+
def test_subquery_load(self):
session = create_session()
-
+
c1 = Child1()
c1.left_child2 = Child2()
session.add(c1)
session.flush()
session.expunge_all()
-
+
for row in session.query(Child1).options(subqueryload('left_child2')).all():
assert row.left_child2
-
+
class EagerToSubclassTest(_base.MappedTest):
"""Test joinedloads to subclass mappers"""
diff --git a/test/orm/inheritance/test_single.py b/test/orm/inheritance/test_single.py
index a65851a5f..b5b9dbf88 100644
--- a/test/orm/inheritance/test_single.py
+++ b/test/orm/inheritance/test_single.py
@@ -43,7 +43,7 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
mapper(Manager, inherits=Employee, polymorphic_identity='manager')
mapper(Engineer, inherits=Employee, polymorphic_identity='engineer')
mapper(JuniorEngineer, inherits=Engineer, polymorphic_identity='juniorengineer')
-
+
@testing.resolve_artifact_names
def test_single_inheritance(self):
@@ -59,7 +59,7 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
assert session.query(Engineer).all() == [e1, e2]
assert session.query(Manager).all() == [m1]
assert session.query(JuniorEngineer).all() == [e2]
-
+
m1 = session.query(Manager).one()
session.expire(m1, ['manager_data'])
eq_(m1.manager_data, "knows how to manage things")
@@ -71,11 +71,11 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
@testing.resolve_artifact_names
def test_multi_qualification(self):
session = create_session()
-
+
m1 = Manager(name='Tom', manager_data='knows how to manage things')
e1 = Engineer(name='Kurt', engineer_info='knows how to hack')
e2 = JuniorEngineer(name='Ed', engineer_info='oh that ed')
-
+
session.add_all([m1, e1, e2])
session.flush()
@@ -84,7 +84,7 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
session.query(Manager, ealias).all(),
[(m1, e1), (m1, e2)]
)
-
+
eq_(
session.query(Manager.name).all(),
[("Tom",)]
@@ -104,12 +104,12 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
session.query(Manager).add_entity(ealias).all(),
[(m1, e1), (m1, e2)]
)
-
+
eq_(
session.query(Manager.name).add_column(ealias.name).all(),
[("Tom", "Kurt"), ("Tom", "Ed")]
)
-
+
# TODO: I think raise error on this for now
# self.assertEquals(
# session.query(Employee.name, Manager.manager_data, Engineer.engineer_info).all(),
@@ -140,7 +140,7 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
'anon_1 WHERE anon_1.employees_type IN '
'(:type_1, :type_2)',
use_default_dialect=True)
-
+
@testing.resolve_artifact_names
def test_select_from(self):
sess = create_session()
@@ -150,12 +150,12 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
e2 = JuniorEngineer(name='Ed', engineer_info='oh that ed')
sess.add_all([m1, m2, e1, e2])
sess.flush()
-
+
eq_(
sess.query(Manager).select_from(employees.select().limit(10)).all(),
[m1, m2]
)
-
+
@testing.resolve_artifact_names
def test_count(self):
sess = create_session()
@@ -169,7 +169,7 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, MappedTest):
eq_(sess.query(Manager).count(), 2)
eq_(sess.query(Engineer).count(), 2)
eq_(sess.query(Employee).count(), 4)
-
+
eq_(sess.query(Manager).filter(Manager.name.like('%m%')).count(), 2)
eq_(sess.query(Employee).filter(Employee.name.like('%m%')).count(), 3)
@@ -216,13 +216,13 @@ class RelationshipFromSingleTest(testing.AssertsCompiledSQL, MappedTest):
Column('name', String(50)),
Column('type', String(20)),
)
-
+
Table('employee_stuff', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('employee_id', Integer, ForeignKey('employee.id')),
Column('name', String(50)),
)
-
+
@classmethod
def setup_classes(cls):
class Employee(ComparableEntity):
@@ -239,7 +239,7 @@ class RelationshipFromSingleTest(testing.AssertsCompiledSQL, MappedTest):
'stuff':relationship(Stuff)
})
mapper(Stuff, employee_stuff)
-
+
sess = create_session()
context = sess.query(Manager).options(subqueryload('stuff'))._compile_context()
subq = context.attributes[('subquery', (class_mapper(Employee), 'stuff'))]
@@ -270,17 +270,17 @@ class RelationshipToSingleTest(MappedTest):
Column('type', String(20)),
Column('company_id', Integer, ForeignKey('companies.company_id'))
)
-
+
Table('companies', metadata,
Column('company_id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('name', String(50)),
)
-
+
@classmethod
def setup_classes(cls):
class Company(ComparableEntity):
pass
-
+
class Employee(ComparableEntity):
pass
class Manager(Employee):
@@ -300,10 +300,10 @@ class RelationshipToSingleTest(MappedTest):
mapper(Engineer, inherits=Employee, polymorphic_identity='engineer')
mapper(JuniorEngineer, inherits=Engineer, polymorphic_identity='juniorengineer')
sess = sessionmaker()()
-
+
c1 = Company(name='c1')
c2 = Company(name='c2')
-
+
m1 = Manager(name='Tom', manager_data='data1', company=c1)
m2 = Manager(name='Tom2', manager_data='data2', company=c2)
e1 = Engineer(name='Kurt', engineer_info='knows how to hack', company=c2)
@@ -338,10 +338,10 @@ class RelationshipToSingleTest(MappedTest):
mapper(Engineer, inherits=Employee, polymorphic_identity='engineer')
mapper(JuniorEngineer, inherits=Engineer, polymorphic_identity='juniorengineer')
sess = sessionmaker()()
-
+
c1 = Company(name='c1')
c2 = Company(name='c2')
-
+
m1 = Manager(name='Tom', manager_data='data1', company=c1)
m2 = Manager(name='Tom2', manager_data='data2', company=c2)
e1 = Engineer(name='Kurt', engineer_info='knows how to hack', company=c2)
@@ -351,7 +351,7 @@ class RelationshipToSingleTest(MappedTest):
eq_(c1.engineers, [e2])
eq_(c2.engineers, [e1])
-
+
sess.expunge_all()
eq_(sess.query(Company).order_by(Company.name).all(),
[
@@ -377,7 +377,7 @@ class RelationshipToSingleTest(MappedTest):
(Company(name='c2'), Engineer(name='Kurt'))
]
)
-
+
# join() to Company.engineers, Engineer as the requested entity.
# this actually applies the IN criterion twice which is less than ideal.
sess.expunge_all()
@@ -396,7 +396,7 @@ class RelationshipToSingleTest(MappedTest):
]
)
- # this however fails as it does not limit the subtypes to just "Engineer".
+ # this however fails as it does not limit the subtypes to just "Engineer".
# with joins constructed by filter(), we seem to be following a policy where
# we don't try to make decisions on how to join to the target class, whereas when using join() we
# seem to have a lot more capabilities.
@@ -412,12 +412,12 @@ class RelationshipToSingleTest(MappedTest):
]
)
go()
-
+
class SingleOnJoinedTest(MappedTest):
@classmethod
def define_tables(cls, metadata):
global persons_table, employees_table
-
+
persons_table = Table('persons', metadata,
Column('person_id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('name', String(50)),
@@ -429,7 +429,7 @@ class SingleOnJoinedTest(MappedTest):
Column('employee_data', String(50)),
Column('manager_data', String(50)),
)
-
+
def test_single_on_joined(self):
class Person(_fixtures.Base):
pass
@@ -437,18 +437,18 @@ class SingleOnJoinedTest(MappedTest):
pass
class Manager(Employee):
pass
-
+
mapper(Person, persons_table, polymorphic_on=persons_table.c.type, polymorphic_identity='person')
mapper(Employee, employees_table, inherits=Person,polymorphic_identity='engineer')
mapper(Manager, inherits=Employee,polymorphic_identity='manager')
-
+
sess = create_session()
sess.add(Person(name='p1'))
sess.add(Employee(name='e1', employee_data='ed1'))
sess.add(Manager(name='m1', employee_data='ed2', manager_data='md1'))
sess.flush()
sess.expunge_all()
-
+
eq_(sess.query(Person).order_by(Person.person_id).all(), [
Person(name='p1'),
Employee(name='e1', employee_data='ed1'),
@@ -466,7 +466,7 @@ class SingleOnJoinedTest(MappedTest):
Manager(name='m1', employee_data='ed2', manager_data='md1')
])
sess.expunge_all()
-
+
def go():
eq_(sess.query(Person).with_polymorphic('*').order_by(Person.person_id).all(), [
Person(name='p1'),
@@ -474,4 +474,4 @@ class SingleOnJoinedTest(MappedTest):
Manager(name='m1', employee_data='ed2', manager_data='md1')
])
self.assert_sql_count(testing.db, go, 1)
-
+
diff --git a/test/orm/test_assorted_eager.py b/test/orm/test_assorted_eager.py
index cedf027dd..eb4104355 100644
--- a/test/orm/test_assorted_eager.py
+++ b/test/orm/test_assorted_eager.py
@@ -21,15 +21,15 @@ class EagerTest(_base.MappedTest):
run_deletes = None
run_inserts = "once"
run_setup_mappers = "once"
-
+
@classmethod
def define_tables(cls, metadata):
-
+
if testing.db.dialect.supports_native_boolean:
false = 'false'
else:
false = "0"
-
+
cls.other_artifacts['false'] = false
Table('owners', metadata ,
@@ -338,7 +338,7 @@ class EagerTest3(_base.MappedTest):
arb_result = [row['data_id'] for row in arb_result]
arb_data = arb_data.alias('arb')
-
+
# now query for Data objects using that above select, adding the
# "order by max desc" separately
q = (session.query(Data).
diff --git a/test/orm/test_attributes.py b/test/orm/test_attributes.py
index e82e9e854..5d74c2062 100644
--- a/test/orm/test_attributes.py
+++ b/test/orm/test_attributes.py
@@ -122,13 +122,13 @@ class AttributesTest(_base.ORMTest):
self.assert_(len(o4.mt2) == 1)
self.assert_(o4.mt2[0].a == 'abcde')
self.assert_(o4.mt2[0].b is None)
-
+
def test_state_gc(self):
"""test that InstanceState always has a dict, even after host object gc'ed."""
-
+
class Foo(object):
pass
-
+
instrumentation.register_class(Foo)
f = Foo()
state = attributes.instance_state(f)
@@ -138,7 +138,7 @@ class AttributesTest(_base.ORMTest):
gc_collect()
assert state.obj() is None
assert state.dict == {}
-
+
def test_deferred(self):
class Foo(object):pass
@@ -233,24 +233,24 @@ class AttributesTest(_base.ORMTest):
a.email_address = 'foo@bar.com'
u.addresses.append(a)
self.assert_(u.user_id == 7 and u.user_name == 'heythere' and u.addresses[0].email_address == 'lala@123.com' and u.addresses[1].email_address == 'foo@bar.com')
-
+
def test_extension_commit_attr(self):
"""test that an extension which commits attribute history
maintains the end-result history.
-
+
This won't work in conjunction with some unitofwork extensions.
-
+
"""
-
+
class Foo(_base.ComparableEntity):
pass
class Bar(_base.ComparableEntity):
pass
-
+
class ReceiveEvents(AttributeExtension):
def __init__(self, key):
self.key = key
-
+
def append(self, state, child, initiator):
if commit:
state.commit_all(state.dict)
@@ -270,34 +270,34 @@ class AttributesTest(_base.ORMTest):
instrumentation.register_class(Bar)
b1, b2, b3, b4 = Bar(id='b1'), Bar(id='b2'), Bar(id='b3'), Bar(id='b4')
-
+
def loadcollection(state, passive):
if passive is attributes.PASSIVE_NO_FETCH:
return attributes.PASSIVE_NO_RESULT
return [b1, b2]
-
+
def loadscalar(state, passive):
if passive is attributes.PASSIVE_NO_FETCH:
return attributes.PASSIVE_NO_RESULT
return b2
-
+
attributes.register_attribute(Foo, 'bars',
uselist=True,
useobject=True,
callable_=loadcollection,
extension=[ReceiveEvents('bars')])
-
+
attributes.register_attribute(Foo, 'bar',
uselist=False,
useobject=True,
callable_=loadscalar,
extension=[ReceiveEvents('bar')])
-
+
attributes.register_attribute(Foo, 'scalar',
uselist=False,
useobject=False, extension=[ReceiveEvents('scalar')])
-
-
+
+
def create_hist():
def hist(key, shouldmatch, fn, *arg):
attributes.instance_state(f1).commit_all(attributes.instance_dict(f1))
@@ -314,7 +314,7 @@ class AttributesTest(_base.ORMTest):
hist('scalar', True, setattr, f1, 'scalar', 5)
hist('scalar', True, setattr, f1, 'scalar', None)
hist('scalar', True, setattr, f1, 'scalar', 4)
-
+
histories = []
commit = False
create_hist()
@@ -330,7 +330,7 @@ class AttributesTest(_base.ORMTest):
eq_(woc, wic)
else:
ne_(woc, wic)
-
+
def test_extension_lazyload_assertion(self):
class Foo(_base.BasicEntity):
pass
@@ -356,7 +356,7 @@ class AttributesTest(_base.ORMTest):
def func1(state, passive):
if passive is attributes.PASSIVE_NO_FETCH:
return attributes.PASSIVE_NO_RESULT
-
+
return [bar1, bar2, bar3]
attributes.register_attribute(Foo, 'bars', uselist=True,
@@ -367,20 +367,20 @@ class AttributesTest(_base.ORMTest):
x = Foo()
assert_raises(AssertionError, Bar(id=4).foos.append, x)
-
+
x.bars
b = Bar(id=4)
b.foos.append(x)
attributes.instance_state(x).expire_attributes(attributes.instance_dict(x), ['bars'])
assert_raises(AssertionError, b.foos.remove, x)
-
-
+
+
def test_scalar_listener(self):
# listeners on ScalarAttributeImpl and MutableScalarAttributeImpl aren't used normally.
# test that they work for the benefit of user extensions
class Foo(object):
pass
-
+
results = []
class ReceiveEvents(AttributeExtension):
def append(self, state, child, initiator):
@@ -392,11 +392,11 @@ class AttributesTest(_base.ORMTest):
def set(self, state, child, oldchild, initiator):
results.append(("set", state.obj(), child, oldchild))
return child
-
+
instrumentation.register_class(Foo)
attributes.register_attribute(Foo, 'x', uselist=False, mutable_scalars=False, useobject=False, extension=ReceiveEvents())
attributes.register_attribute(Foo, 'y', uselist=False, mutable_scalars=True, useobject=False, copy_function=lambda x:x, extension=ReceiveEvents())
-
+
f = Foo()
f.x = 5
f.x = 17
@@ -404,7 +404,7 @@ class AttributesTest(_base.ORMTest):
f.y = [1,2,3]
f.y = [4,5,6]
del f.y
-
+
eq_(results, [
('set', f, 5, None),
('set', f, 17, 5),
@@ -413,12 +413,12 @@ class AttributesTest(_base.ORMTest):
('set', f, [4,5,6], [1,2,3]),
('remove', f, [4,5,6])
])
-
-
+
+
def test_lazytrackparent(self):
"""test that the "hasparent" flag works properly
when lazy loaders and backrefs are used
-
+
"""
class Post(object):pass
@@ -640,7 +640,7 @@ class AttributesTest(_base.ORMTest):
attributes.unregister_attribute(Foo, "collection")
assert not attributes.manager_of_class(Foo).is_instrumented("collection")
-
+
try:
attributes.register_attribute(Foo, "collection", uselist=True, typecallable=dict, useobject=True)
assert False
@@ -690,11 +690,11 @@ class UtilTest(_base.ORMTest):
class Bar(object):
pass
-
+
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
attributes.register_attribute(Foo, "coll", uselist=True, useobject=True)
-
+
f1 = Foo()
b1 = Bar()
b2 = Bar()
@@ -706,7 +706,7 @@ class UtilTest(_base.ORMTest):
eq_(attributes.get_history(f1, "coll"), ([b1], [], []))
attributes.set_committed_value(f1, "coll", [b2])
eq_(attributes.get_history(f1, "coll"), ((), [b2], ()))
-
+
attributes.del_attribute(f1, "coll")
assert "coll" not in f1.__dict__
@@ -781,11 +781,11 @@ class BackrefTest(_base.ORMTest):
attributes.register_attribute(Port, 'jack', uselist=False,
useobject=True, backref="port")
-
+
attributes.register_attribute(Jack, 'port', uselist=False,
useobject=True, backref="jack")
-
-
+
+
p = Port()
j = Jack()
p.jack = j
@@ -800,7 +800,7 @@ class BackrefTest(_base.ORMTest):
a token that is global to all InstrumentedAttribute objects
within a particular class, not just the indvidual IA object
since we use distinct objects in an inheritance scenario.
-
+
"""
class Parent(object):
pass
@@ -811,7 +811,7 @@ class BackrefTest(_base.ORMTest):
p_token = object()
c_token = object()
-
+
instrumentation.register_class(Parent)
instrumentation.register_class(Child)
instrumentation.register_class(SubChild)
@@ -828,11 +828,11 @@ class BackrefTest(_base.ORMTest):
backref="child",
parent_token = c_token,
useobject=True)
-
+
p1 = Parent()
c1 = Child()
p1.child = c1
-
+
c2 = SubChild()
c2.parent = p1
@@ -846,7 +846,7 @@ class BackrefTest(_base.ORMTest):
p_token = object()
c_token = object()
-
+
instrumentation.register_class(Parent)
instrumentation.register_class(SubParent)
instrumentation.register_class(Child)
@@ -862,26 +862,26 @@ class BackrefTest(_base.ORMTest):
backref='children',
parent_token = c_token,
useobject=True)
-
+
p1 = Parent()
p2 = SubParent()
c1 = Child()
-
+
p1.children.append(c1)
assert c1.parent is p1
assert c1 in p1.children
-
+
p2.children.append(c1)
assert c1.parent is p2
-
+
# note its still in p1.children -
# the event model currently allows only
# one level deep. without the parent_token,
# it keeps going until a ValueError is raised
# and this condition changes.
assert c1 in p1.children
-
+
class PendingBackrefTest(_base.ORMTest):
def setup(self):
global Post, Blog, called, lazy_load
@@ -926,7 +926,7 @@ class PendingBackrefTest(_base.ORMTest):
b = Blog("blog 1")
p = Post("post 4")
-
+
p.blog = b
p = Post("post 5")
p.blog = b
@@ -936,17 +936,17 @@ class PendingBackrefTest(_base.ORMTest):
# calling backref calls the callable, populates extra posts
assert b.posts == [p1, p2, p3, Post("post 4"), Post("post 5")]
assert called[0] == 1
-
+
def test_lazy_history(self):
global lazy_load
p1, p2, p3 = Post("post 1"), Post("post 2"), Post("post 3")
lazy_load = [p1, p2, p3]
-
+
b = Blog("blog 1")
p = Post("post 4")
p.blog = b
-
+
p4 = Post("post 5")
p4.blog = b
assert called[0] == 0
@@ -1022,7 +1022,7 @@ class HistoryTest(_base.ORMTest):
f = Foo()
f.someattr = 3
eq_(Foo.someattr.impl.get_committed_value(attributes.instance_state(f), attributes.instance_dict(f)), None)
-
+
attributes.instance_state(f).commit(attributes.instance_dict(f), ['someattr'])
eq_(Foo.someattr.impl.get_committed_value(attributes.instance_state(f), attributes.instance_dict(f)), 3)
@@ -1084,8 +1084,8 @@ class HistoryTest(_base.ORMTest):
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), (['one'], (), ()))
f.someattr = 'two'
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), (['two'], (), ()))
-
-
+
+
def test_mutable_scalar(self):
class Foo(_base.BasicEntity):
pass
@@ -1138,12 +1138,12 @@ class HistoryTest(_base.ORMTest):
attributes.instance_state(f).commit_all(attributes.instance_dict(f))
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), ((), [{'a':'b'},], ()))
-
+
f.someattr['a'] = 'c'
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), ((), [{'a':'c'},], ()))
attributes.flag_modified(f, 'someattr')
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), ([{'a':'c'},], (), ()))
-
+
f.someattr = ['a']
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), ([['a']], (), ()))
attributes.instance_state(f).commit_all(attributes.instance_dict(f))
@@ -1156,7 +1156,7 @@ class HistoryTest(_base.ORMTest):
attributes.flag_modified(f, 'someattr')
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), ([['b', 'c']], (), ()))
-
+
def test_use_object(self):
class Foo(_base.BasicEntity):
pass
@@ -1395,10 +1395,10 @@ class HistoryTest(_base.ORMTest):
attributes.instance_state(f).commit_all(attributes.instance_dict(f))
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), ((), [hi, there, hi], ()))
-
+
f.someattr = []
eq_(attributes.get_state_history(attributes.instance_state(f), 'someattr'), ([], [], [hi, there, hi]))
-
+
def test_collections_via_backref(self):
class Foo(_base.BasicEntity):
pass
@@ -1621,12 +1621,12 @@ class HistoryTest(_base.ORMTest):
class ListenerTest(_base.ORMTest):
def test_receive_changes(self):
"""test that Listeners can mutate the given value."""
-
+
class Foo(object):
pass
class Bar(object):
pass
-
+
def append(state, child, initiator):
b2 = Bar()
b2.data = b1.data + " appended"
@@ -1641,11 +1641,11 @@ class ListenerTest(_base.ORMTest):
attributes.register_attribute(Foo, 'barlist', uselist=True, useobject=True)
attributes.register_attribute(Foo, 'barset', typecallable=set, uselist=True, useobject=True)
attributes.register_attribute(Bar, 'data', uselist=False, useobject=False)
-
+
event.listen(Foo.data, 'set', on_set, retval=True)
event.listen(Foo.barlist, 'append', append, retval=True)
event.listen(Foo.barset, 'append', append, retval=True)
-
+
f1 = Foo()
f1.data = "some data"
eq_(f1.data, "some data modified")
@@ -1654,10 +1654,10 @@ class ListenerTest(_base.ORMTest):
f1.barlist.append(b1)
assert b1.data == "some bar"
assert f1.barlist[0].data == "some bar appended"
-
+
f1.barset.add(b1)
assert f1.barset.pop().data == "some bar appended"
-
+
def test_propagate(self):
classes = [None, None, None]
canary = []
@@ -1665,45 +1665,45 @@ class ListenerTest(_base.ORMTest):
class A(object):
pass
classes[0] = A
-
+
def make_b():
class B(classes[0]):
pass
classes[1] = B
-
+
def make_c():
class C(classes[1]):
pass
classes[2] = C
-
+
def instrument_a():
instrumentation.register_class(classes[0])
def instrument_b():
instrumentation.register_class(classes[1])
-
+
def instrument_c():
instrumentation.register_class(classes[2])
-
+
def attr_a():
attributes.register_attribute(classes[0], 'attrib', uselist=False, useobject=False)
-
+
def attr_b():
attributes.register_attribute(classes[1], 'attrib', uselist=False, useobject=False)
def attr_c():
attributes.register_attribute(classes[2], 'attrib', uselist=False, useobject=False)
-
+
def set(state, value, oldvalue, initiator):
canary.append(value)
-
+
def events_a():
event.listen(classes[0].attrib, 'set', set, propagate=True)
-
+
def teardown():
classes[:] = [None, None, None]
canary[:] = []
-
+
ordering = [
(instrument_a, instrument_b),
(instrument_b, instrument_c),
@@ -1722,20 +1722,20 @@ class ListenerTest(_base.ORMTest):
elements = [make_a, make_b, make_c,
instrument_a, instrument_b, instrument_c,
attr_a, attr_b, attr_c, events_a]
-
+
for i, series in enumerate(all_partial_orderings(ordering, elements)):
for fn in series:
fn()
-
+
b = classes[1]()
b.attrib = "foo"
eq_(b.attrib, "foo")
eq_(canary, ["foo"])
-
+
c = classes[2]()
c.attrib = "bar"
eq_(c.attrib, "bar")
eq_(canary, ["foo", "bar"])
-
+
teardown()
-
+
diff --git a/test/orm/test_backref_mutations.py b/test/orm/test_backref_mutations.py
index 455e93a30..d0aae128c 100644
--- a/test/orm/test_backref_mutations.py
+++ b/test/orm/test_backref_mutations.py
@@ -40,15 +40,15 @@ class O2MCollectionTest(_fixtures.FixtureTest):
u2= User(name='ed')
sess.add_all([u1, a1, a2, a3])
sess.commit()
-
+
#u1.addresses
-
+
def go():
u2.addresses.append(a1)
u2.addresses.append(a2)
u2.addresses.append(a3)
self.assert_sql_count(testing.db, go, 0)
-
+
@testing.resolve_artifact_names
def test_collection_move_preloaded(self):
sess = sessionmaker()()
@@ -87,7 +87,7 @@ class O2MCollectionTest(_fixtures.FixtureTest):
# backref fires
assert a1.user is u2
-
+
# u1.addresses wasn't loaded,
# so when it loads its correct
assert a1 not in u1.addresses
@@ -110,7 +110,7 @@ class O2MCollectionTest(_fixtures.FixtureTest):
# backref fires
assert a1.user is u2
-
+
# everything expires, no changes in
# u1.addresses, so all is fine
sess.commit()
@@ -144,7 +144,7 @@ class O2MCollectionTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_plain_load_passive(self):
"""test that many-to-one set doesn't load the old value."""
-
+
sess = sessionmaker()()
u1 = User(name='jack')
u2 = User(name='ed')
@@ -159,10 +159,10 @@ class O2MCollectionTest(_fixtures.FixtureTest):
def go():
a1.user = u2
self.assert_sql_count(testing.db, go, 0)
-
+
assert a1 not in u1.addresses
assert a1 in u2.addresses
-
+
@testing.resolve_artifact_names
def test_set_none(self):
sess = sessionmaker()()
@@ -176,11 +176,11 @@ class O2MCollectionTest(_fixtures.FixtureTest):
def go():
a1.user = None
self.assert_sql_count(testing.db, go, 0)
-
+
assert a1 not in u1.addresses
-
-
-
+
+
+
@testing.resolve_artifact_names
def test_scalar_move_notloaded(self):
sess = sessionmaker()()
@@ -218,7 +218,7 @@ class O2MCollectionTest(_fixtures.FixtureTest):
# "old" u1 here allows the backref
# to remove it from the addresses collection
a1.user = u2
-
+
sess.commit()
assert a1 not in u1.addresses
assert a1 in u2.addresses
@@ -271,13 +271,13 @@ class O2OScalarBackrefMoveTest(_fixtures.FixtureTest):
# load a1.user
a1.user
-
+
# reassign
a2.user = u1
# backref fires
assert u1.address is a2
-
+
# stays on both sides
assert a1.user is u1
assert a2.user is u1
@@ -298,7 +298,7 @@ class O2OScalarBackrefMoveTest(_fixtures.FixtureTest):
# backref fires
assert a1.user is u2
-
+
# u1.address loads now after a flush
assert u1.address is None
assert u2.address is a1
@@ -361,7 +361,7 @@ class O2OScalarBackrefMoveTest(_fixtures.FixtureTest):
# load
assert a1.user is u1
-
+
# reassign
a2.user = u1
@@ -370,7 +370,7 @@ class O2OScalarBackrefMoveTest(_fixtures.FixtureTest):
# didnt work this way tho
assert a1.user is u1
-
+
# moves appropriately after commit
sess.commit()
assert u1.address is a2
@@ -429,19 +429,19 @@ class O2OScalarOrphanTest(_fixtures.FixtureTest):
sess = sessionmaker()()
a1 = Address(email_address="address1")
u1 = User(name='jack', address=a1)
-
+
sess.add(u1)
sess.commit()
sess.expunge(u1)
-
+
u2= User(name='ed')
# the _SingleParent extension sets the backref get to "active" !
# u1 gets loaded and deleted
u2.address = a1
sess.commit()
assert sess.query(User).count() == 1
-
-
+
+
class M2MScalarMoveTest(_fixtures.FixtureTest):
run_inserts = None
@@ -452,25 +452,25 @@ class M2MScalarMoveTest(_fixtures.FixtureTest):
'keyword':relationship(Keyword, secondary=item_keywords, uselist=False, backref=backref("item", uselist=False))
})
mapper(Keyword, keywords)
-
+
@testing.resolve_artifact_names
def test_collection_move_preloaded(self):
sess = sessionmaker()()
-
+
k1 = Keyword(name='k1')
i1 = Item(description='i1', keyword=k1)
i2 = Item(description='i2')
sess.add_all([i1, i2, k1])
sess.commit() # everything is expired
-
+
# load i1.keyword
assert i1.keyword is k1
-
+
i2.keyword = k1
assert k1.item is i2
-
+
# nothing happens.
assert i1.keyword is k1
assert i2.keyword is k1
diff --git a/test/orm/test_cascade.py b/test/orm/test_cascade.py
index b36f52ac2..ccc5120f8 100644
--- a/test/orm/test_cascade.py
+++ b/test/orm/test_cascade.py
@@ -35,7 +35,7 @@ class O2MCascadeDeleteOrphanTest(_base.MappedTest):
Column('address_id', Integer, ForeignKey('addresses.id')),
Column('data', String(30))
)
-
+
@classmethod
def setup_classes(cls):
class User(_base.ComparableEntity):
@@ -46,7 +46,7 @@ class O2MCascadeDeleteOrphanTest(_base.MappedTest):
pass
class Dingaling(_base.ComparableEntity):
pass
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
@@ -55,11 +55,11 @@ class O2MCascadeDeleteOrphanTest(_base.MappedTest):
mapper(User, users, properties={
'addresses':relationship(Address,
cascade='all, delete-orphan', backref='user'),
-
+
'orders':relationship(Order,
cascade='all, delete-orphan', order_by=orders.c.id)
})
-
+
mapper(Dingaling, dingalings, properties={
'address' : relationship(Address)
})
@@ -122,22 +122,22 @@ class O2MCascadeDeleteOrphanTest(_base.MappedTest):
assert o2 in sess
assert o3 in sess
sess.commit()
-
+
@testing.resolve_artifact_names
def test_remove_pending_from_collection(self):
sess = Session()
-
+
u = User(name='jack')
sess.add(u)
sess.commit()
-
+
o1 = Order()
u.orders.append(o1)
assert o1 in sess
u.orders.remove(o1)
assert o1 not in sess
-
-
+
+
@testing.resolve_artifact_names
def test_delete(self):
sess = create_session()
@@ -207,14 +207,14 @@ class O2MCascadeDeleteOrphanTest(_base.MappedTest):
def test_cascade_nosideeffects(self):
"""test that cascade leaves the state of unloaded
scalars/collections unchanged."""
-
+
sess = create_session()
u = User(name='jack')
sess.add(u)
assert 'orders' not in u.__dict__
sess.flush()
-
+
assert 'orders' not in u.__dict__
a = Address(email_address='foo@bar.com')
@@ -222,14 +222,14 @@ class O2MCascadeDeleteOrphanTest(_base.MappedTest):
assert 'user' not in a.__dict__
a.user = u
sess.flush()
-
+
d = Dingaling(data='d1')
d.address_id = a.id
sess.add(d)
assert 'address' not in d.__dict__
sess.flush()
assert d.address is a
-
+
@testing.resolve_artifact_names
def test_cascade_delete_plusorphans(self):
sess = create_session()
@@ -268,7 +268,7 @@ class O2MCascadeDeleteOrphanTest(_base.MappedTest):
class O2MCascadeDeleteNoOrphanTest(_base.MappedTest):
run_inserts = None
-
+
@classmethod
def define_tables(cls, metadata):
Table('users', metadata,
@@ -280,14 +280,14 @@ class O2MCascadeDeleteNoOrphanTest(_base.MappedTest):
Column('user_id', Integer, ForeignKey('users.id')),
Column('description', String(30))
)
-
+
@classmethod
def setup_classes(cls):
class User(_base.ComparableEntity):
pass
class Order(_base.ComparableEntity):
pass
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
@@ -315,7 +315,7 @@ class O2MCascadeDeleteNoOrphanTest(_base.MappedTest):
class O2OSingleParentTest(_fixtures.FixtureTest):
run_inserts = None
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
@@ -334,12 +334,12 @@ class O2OSingleParentTest(_fixtures.FixtureTest):
u1.address = a2
assert u1.address is not a1
assert a1.user is None
-
+
class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
"""Test related item not present in session, commit proceeds."""
run_inserts = None
-
+
@testing.resolve_artifact_names
def _one_to_many_fixture(self, o2m_cascade=True,
m2o_cascade=True,
@@ -347,7 +347,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
m2o=False,
o2m_cascade_backrefs=True,
m2o_cascade_backrefs=True):
-
+
if o2m:
if m2o:
addresses_rel = {'addresses':relationship(
@@ -359,7 +359,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
cascade_backrefs=m2o_cascade_backrefs
)
)}
-
+
else:
addresses_rel = {'addresses':relationship(
Address,
@@ -376,7 +376,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
else:
addresses_rel = {}
user_rel = {}
-
+
mapper(User, users, properties=addresses_rel)
mapper(Address, addresses, properties=user_rel)
@@ -387,7 +387,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
bkd=False,
fwd_cascade_backrefs=True,
bkd_cascade_backrefs=True):
-
+
if fwd:
if bkd:
keywords_rel = {'keywords':relationship(
@@ -400,7 +400,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
cascade_backrefs=bkd_cascade_backrefs
)
)}
-
+
else:
keywords_rel = {'keywords':relationship(
Keyword,
@@ -419,7 +419,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
else:
keywords_rel = {}
items_rel = {}
-
+
mapper(Item, items, properties=keywords_rel)
mapper(Keyword, keywords, properties=items_rel)
@@ -434,7 +434,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
assert u1 in sess
assert a1 in sess
sess.flush()
-
+
@testing.resolve_artifact_names
def test_o2m_only_child_transient(self):
self._one_to_many_fixture(o2m=True, m2o=False, o2m_cascade=False)
@@ -457,9 +457,9 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
a1 = Address(email_address='a1')
sess.add(a1)
sess.flush()
-
+
sess.expunge_all()
-
+
u1.addresses.append(a1)
sess.add(u1)
assert u1 in sess
@@ -467,7 +467,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
assert_raises_message(
sa_exc.SAWarning, "not in session", sess.flush
)
-
+
@testing.resolve_artifact_names
def test_o2m_backref_child_pending(self):
self._one_to_many_fixture(o2m=True, m2o=True)
@@ -511,7 +511,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.commit()
go()
eq_(u1.addresses, [])
-
+
@testing.resolve_artifact_names
def test_o2m_backref_child_expunged(self):
self._one_to_many_fixture(o2m=True, m2o=True,
@@ -521,7 +521,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
a1 = Address(email_address='a1')
sess.add(a1)
sess.flush()
-
+
sess.add(u1)
u1.addresses.append(a1)
sess.expunge(a1)
@@ -540,7 +540,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
a1 = Address(email_address='a1')
sess.add(a1)
sess.flush()
-
+
sess.add(u1)
u1.addresses.append(a1)
sess.expunge(a1)
@@ -585,7 +585,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
u1 = User(name='u1')
sess.add(u1)
sess.flush()
-
+
a1 = Address(email_address='a1')
a1.user = u1
sess.add(a1)
@@ -629,7 +629,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
u1 = User(name='u1')
sess.add(u1)
sess.flush()
-
+
a1 = Address(email_address='a1')
a1.user = u1
sess.add(a1)
@@ -645,7 +645,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
self._one_to_many_fixture(o2m=True, m2o=True, m2o_cascade=False)
sess = Session()
u1 = User(name='u1')
-
+
a1 = Address(email_address='a1')
a1.user = u1
sess.add(a1)
@@ -665,7 +665,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
u1 = User(name='u1')
sess.add(u1)
sess.flush()
-
+
a1 = Address(email_address='a1')
a1.user = u1
sess.add(a1)
@@ -690,7 +690,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
assert i1 in sess
assert k1 in sess
sess.flush()
-
+
@testing.resolve_artifact_names
def test_m2m_only_child_transient(self):
self._many_to_many_fixture(fwd=True, bkd=False, fwd_cascade=False)
@@ -713,9 +713,9 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
k1 = Keyword(name='k1')
sess.add(k1)
sess.flush()
-
+
sess.expunge_all()
-
+
i1.keywords.append(k1)
sess.add(i1)
assert i1 in sess
@@ -723,7 +723,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
assert_raises_message(
sa_exc.SAWarning, "not in session", sess.flush
)
-
+
@testing.resolve_artifact_names
def test_m2m_backref_child_pending(self):
self._many_to_many_fixture(fwd=True, bkd=True)
@@ -767,7 +767,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.commit()
go()
eq_(i1.keywords, [])
-
+
@testing.resolve_artifact_names
def test_m2m_backref_child_expunged(self):
self._many_to_many_fixture(fwd=True, bkd=True,
@@ -777,7 +777,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
k1 = Keyword(name='k1')
sess.add(k1)
sess.flush()
-
+
sess.add(i1)
i1.keywords.append(k1)
sess.expunge(k1)
@@ -796,7 +796,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
k1 = Keyword(name='k1')
sess.add(k1)
sess.flush()
-
+
sess.add(i1)
i1.keywords.append(k1)
sess.expunge(k1)
@@ -811,7 +811,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
class NoSaveCascadeBackrefTest(_fixtures.FixtureTest):
"""test that backrefs don't force save-update cascades to occur
when the cascade initiated from the forwards side."""
-
+
@testing.resolve_artifact_names
def test_unidirectional_cascade_o2m(self):
mapper(Order, orders)
@@ -819,17 +819,17 @@ class NoSaveCascadeBackrefTest(_fixtures.FixtureTest):
orders = relationship(
Order, backref=backref("user", cascade=None))
))
-
+
sess = create_session()
-
+
o1 = Order()
sess.add(o1)
u1 = User(orders=[o1])
assert u1 not in sess
assert o1 in sess
-
+
sess.expunge_all()
-
+
o1 = Order()
u1 = User(orders=[o1])
sess.add(o1)
@@ -842,16 +842,16 @@ class NoSaveCascadeBackrefTest(_fixtures.FixtureTest):
'user':relationship(User, backref=backref("orders", cascade=None))
})
mapper(User, users)
-
+
sess = create_session()
-
+
u1 = User()
sess.add(u1)
o1 = Order()
o1.user = u1
assert o1 not in sess
assert u1 in sess
-
+
sess.expunge_all()
u1 = User()
@@ -876,9 +876,9 @@ class NoSaveCascadeBackrefTest(_fixtures.FixtureTest):
i1.keywords.append(k1)
assert i1 in sess
assert k1 not in sess
-
+
sess.expunge_all()
-
+
i1 = Item()
k1 = Keyword()
sess.add(i1)
@@ -886,7 +886,7 @@ class NoSaveCascadeBackrefTest(_fixtures.FixtureTest):
assert i1 in sess
assert k1 not in sess
-
+
class M2OCascadeDeleteOrphanTestOne(_base.MappedTest):
@classmethod
@@ -920,7 +920,7 @@ class M2OCascadeDeleteOrphanTestOne(_base.MappedTest):
pass
class Foo(_fixtures.Base):
pass
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
@@ -960,8 +960,8 @@ class M2OCascadeDeleteOrphanTestOne(_base.MappedTest):
"""test a bug introduced by r6711"""
sess = sessionmaker(expire_on_commit=True)()
-
-
+
+
u1 = User(name='jack', foo=Foo(data='f1'))
sess.add(u1)
sess.commit()
@@ -975,7 +975,7 @@ class M2OCascadeDeleteOrphanTestOne(_base.MappedTest):
attributes.get_history(u1, 'foo'),
([None], (), [attributes.PASSIVE_NO_RESULT])
)
-
+
sess.add(u1)
assert u1 in sess
sess.commit()
@@ -987,15 +987,15 @@ class M2OCascadeDeleteOrphanTestOne(_base.MappedTest):
sess = sessionmaker(expire_on_commit=False)()
p1, p2 = Pref(data='p1'), Pref(data='p2')
-
-
+
+
u = User(name='jack', pref=p1)
sess.add(u)
sess.commit()
sess.close()
u.pref = p2
-
+
sess.add(u)
assert p1 in sess
assert p2 in sess
@@ -1057,13 +1057,13 @@ class M2OCascadeDeleteOrphanTestTwo(_base.MappedTest):
test_needs_autoincrement=True),
Column('data', String(50)),
Column('t2id', Integer, ForeignKey('t2.id')))
-
+
Table('t2', metadata,
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
Column('data', String(50)),
Column('t3id', Integer, ForeignKey('t3.id')))
-
+
Table('t3', metadata,
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
@@ -1146,7 +1146,7 @@ class M2OCascadeDeleteOrphanTestTwo(_base.MappedTest):
def test_single_parent_raise(self):
sess = create_session()
-
+
y = T2(data='T2a')
x = T1(data='T1a', t2=y)
assert_raises(sa_exc.InvalidRequestError, T1, data='T1b', t2=y)
@@ -1155,13 +1155,13 @@ class M2OCascadeDeleteOrphanTestTwo(_base.MappedTest):
def test_single_parent_backref(self):
sess = create_session()
-
+
y = T3(data='T3a')
x = T2(data='T2a', t3=y)
# cant attach the T3 to another T2
assert_raises(sa_exc.InvalidRequestError, T2, data='T2b', t3=y)
-
+
# set via backref tho is OK, unsets from previous parent
# first
z = T2(data='T2b')
@@ -1178,13 +1178,13 @@ class M2OCascadeDeleteNoOrphanTest(_base.MappedTest):
test_needs_autoincrement=True),
Column('data',String(50)),
Column('t2id', Integer, ForeignKey('t2.id')))
-
+
Table('t2', metadata,
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
Column('data',String(50)),
Column('t3id', Integer, ForeignKey('t3.id')))
-
+
Table('t3', metadata,
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
@@ -1310,13 +1310,13 @@ class M2MCascadeTest(_base.MappedTest):
test_needs_autoincrement=True),
Column('data', String(30)),
test_needs_fk=True
-
+
)
Table('atob', metadata,
Column('aid', Integer, ForeignKey('a.id')),
Column('bid', Integer, ForeignKey('b.id')),
test_needs_fk=True
-
+
)
Table('c', metadata,
Column('id', Integer, primary_key=True,
@@ -1324,7 +1324,7 @@ class M2MCascadeTest(_base.MappedTest):
Column('data', String(30)),
Column('bid', Integer, ForeignKey('b.id')),
test_needs_fk=True
-
+
)
@classmethod
@@ -1433,7 +1433,7 @@ class M2MCascadeTest(_base.MappedTest):
sess = create_session()
b1 =B(data='b1')
a1 = A(data='a1', bs=[b1])
-
+
assert_raises(sa_exc.InvalidRequestError,
A, data='a2', bs=[b1]
)
@@ -1441,7 +1441,7 @@ class M2MCascadeTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_single_parent_backref(self):
"""test that setting m2m via a uselist=False backref bypasses the single_parent raise"""
-
+
mapper(A, a, properties={
'bs':relationship(B,
secondary=atob,
@@ -1453,12 +1453,12 @@ class M2MCascadeTest(_base.MappedTest):
sess = create_session()
b1 =B(data='b1')
a1 = A(data='a1', bs=[b1])
-
+
assert_raises(
sa_exc.InvalidRequestError,
A, data='a2', bs=[b1]
)
-
+
a2 = A(data='a2')
b1.a = a2
assert b1 not in a1.bs
@@ -1475,7 +1475,7 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
'addresses':relationship(Address, backref='user',
cascade_backrefs=False)
})
-
+
mapper(Dingaling, dingalings, properties={
'address' : relationship(Address, backref='dingalings',
cascade_backrefs=False)
@@ -1484,10 +1484,10 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_o2m_basic(self):
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
-
+
a1 = Address(email_address='a1')
a1.user = u1
assert a1 not in sess
@@ -1496,29 +1496,29 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_o2m_commit_warns(self):
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
-
+
a1 = Address(email_address='a1')
a1.user = u1
-
+
assert_raises_message(
sa_exc.SAWarning,
"not in session",
sess.commit
)
-
+
assert a1 not in sess
-
+
@testing.resolve_artifact_names
def test_o2m_flag_on_backref(self):
sess = Session()
-
+
a1 = Address(email_address='a1')
sess.add(a1)
-
+
d1 = Dingaling()
d1.address = a1
assert d1 in a1.dingalings
@@ -1533,7 +1533,7 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
a1 = Address(email_address='a1')
d1 = Dingaling()
sess.add(d1)
-
+
a1.dingalings.append(d1)
assert a1 not in sess
@@ -1543,7 +1543,7 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
a1 = Address(email_address='a1')
sess.add(a1)
-
+
u1 = User(name='u1')
u1.addresses.append(a1)
assert u1 in sess
@@ -1555,7 +1555,7 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
a1 = Address(email_address='a1')
d1 = Dingaling()
sess.add(d1)
-
+
a1.dingalings.append(d1)
assert a1 not in sess
@@ -1592,17 +1592,17 @@ class PendingOrphanTestSingleLevel(_base.MappedTest):
pass
class Order(_fixtures.Base):
pass
-
+
@testing.resolve_artifact_names
def test_pending_standalone_orphan(self):
"""Standalone 'orphan' objects can now be persisted, if the underlying
- constraints of the database allow it.
-
+ constraints of the database allow it.
+
This now supports persisting of objects based on foreign key
values alone.
-
+
"""
-
+
mapper(Order, orders)
mapper(Address, addresses)
mapper(User, users, properties=dict(
@@ -1611,13 +1611,13 @@ class PendingOrphanTestSingleLevel(_base.MappedTest):
orders=relationship(Order, cascade='all, delete-orphan')
))
s = Session()
-
+
# the standalone Address goes in, its foreign key
# allows NULL
a = Address()
s.add(a)
s.commit()
-
+
# the standalone Order does not.
o = Order()
s.add(o)
@@ -1633,7 +1633,7 @@ class PendingOrphanTestSingleLevel(_base.MappedTest):
s.add(o)
s.commit()
assert o in s and o not in s.new
-
+
@testing.resolve_artifact_names
def test_pending_collection_expunge(self):
@@ -1683,11 +1683,11 @@ class PendingOrphanTestSingleLevel(_base.MappedTest):
class PendingOrphanTestTwoLevel(_base.MappedTest):
"""test usages stated at
-
+
http://article.gmane.org/gmane.comp.python.sqlalchemy.user/3085
http://article.gmane.org/gmane.comp.python.sqlalchemy.user/3119
"""
-
+
@classmethod
def define_tables(cls, metadata):
Table('order', metadata,
@@ -1701,7 +1701,7 @@ class PendingOrphanTestTwoLevel(_base.MappedTest):
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('item_id', Integer, ForeignKey('item.id'), nullable=False)
)
-
+
@classmethod
def setup_classes(cls):
class Order(_base.ComparableEntity):
@@ -1710,7 +1710,7 @@ class PendingOrphanTestTwoLevel(_base.MappedTest):
pass
class Attribute(_base.ComparableEntity):
pass
-
+
@testing.resolve_artifact_names
def test_singlelevel_remove(self):
mapper(Order, order, properties={
@@ -1720,13 +1720,13 @@ class PendingOrphanTestTwoLevel(_base.MappedTest):
s = Session()
o1 = Order()
s.add(o1)
-
+
i1 = Item()
o1.items.append(i1)
o1.items.remove(i1)
s.commit()
assert i1 not in o1.items
-
+
@testing.resolve_artifact_names
def test_multilevel_remove(self):
mapper(Order, order, properties={
@@ -1748,7 +1748,7 @@ class PendingOrphanTestTwoLevel(_base.MappedTest):
assert i1 in s
assert a1 in s
-
+
# i1 is an orphan so the operation
# removes 'i1'. The operation
# cascades down to 'a1'.
@@ -1756,7 +1756,7 @@ class PendingOrphanTestTwoLevel(_base.MappedTest):
assert i1 not in s
assert a1 not in s
-
+
s.commit()
assert o1 in s
assert a1 not in s
@@ -1766,7 +1766,7 @@ class PendingOrphanTestTwoLevel(_base.MappedTest):
class DoubleParentO2MOrphanTest(_base.MappedTest):
"""Test orphan behavior on an entity that requires
two parents via many-to-one (one-to-many collection.).
-
+
"""
@classmethod
@@ -1779,7 +1779,7 @@ class DoubleParentO2MOrphanTest(_base.MappedTest):
Column('account_id', Integer,primary_key=True,
test_needs_autoincrement=True),
Column('balance', Integer))
-
+
Table('customers', meta,
Column('customer_id', Integer,primary_key=True,
test_needs_autoincrement=True),
@@ -1793,7 +1793,7 @@ class DoubleParentO2MOrphanTest(_base.MappedTest):
def test_double_parent_expunge_o2m(self):
"""test the delete-orphan uow event for multiple delete-orphan
parent relationships."""
-
+
class Customer(_fixtures.Base):
pass
class Account(_fixtures.Base):
@@ -1871,11 +1871,11 @@ class DoubleParentO2MOrphanTest(_base.MappedTest):
assert c not in s, \
'Should expunge customer when both parents are gone'
-
+
class DoubleParentM2OOrphanTest(_base.MappedTest):
"""Test orphan behavior on an entity that requires
two parents via one-to-many (many-to-one reference to the orphan).
-
+
"""
@classmethod
@@ -2013,9 +2013,9 @@ class CollectionAssignmentOrphanTest(_base.MappedTest):
class O2MConflictTest(_base.MappedTest):
"""test that O2M dependency detects a change in parent, does the
right thing, and updates the collection/attribute.
-
+
"""
-
+
@classmethod
def define_tables(cls, metadata):
Table("parent", metadata,
@@ -2028,18 +2028,18 @@ class O2MConflictTest(_base.MappedTest):
Column('parent_id', Integer, ForeignKey('parent.id'),
nullable=False)
)
-
+
@classmethod
def setup_classes(cls):
class Parent(_base.ComparableEntity):
pass
class Child(_base.ComparableEntity):
pass
-
+
@testing.resolve_artifact_names
def _do_move_test(self, delete_old):
sess = create_session()
-
+
p1, p2, c1 = Parent(), Parent(), Child()
if Parent.child.property.uselist:
p1.child.append(c1)
@@ -2047,10 +2047,10 @@ class O2MConflictTest(_base.MappedTest):
p1.child = c1
sess.add_all([p1, c1])
sess.flush()
-
+
if delete_old:
sess.delete(p1)
-
+
if Parent.child.property.uselist:
p2.child.append(c1)
else:
@@ -2086,7 +2086,7 @@ class O2MConflictTest(_base.MappedTest):
mapper(Child, child)
self._do_move_test(True)
self._do_move_test(False)
-
+
@testing.resolve_artifact_names
def test_o2o_delcascade_delete_old(self):
mapper(Parent, parent, properties={
@@ -2138,7 +2138,7 @@ class O2MConflictTest(_base.MappedTest):
})
self._do_move_test(True)
self._do_move_test(False)
-
+
class PartialFlushTest(_base.MappedTest):
"""test cascade behavior as it relates to object lists passed to flush()."""
@@ -2218,7 +2218,7 @@ class PartialFlushTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_circular_sort(self):
"""test ticket 1306"""
-
+
class Base(_base.ComparableEntity):
pass
class Parent(Base):
@@ -2246,9 +2246,9 @@ class PartialFlushTest(_base.MappedTest):
c1, c2, c3 = Child(), Child(), Child()
p1.children = [c1, c2, c3]
sess.add(p1)
-
+
sess.flush([c1])
assert p1 in sess.new
assert c1 not in sess.new
assert c2 in sess.new
-
+
diff --git a/test/orm/test_collection.py b/test/orm/test_collection.py
index 540213745..8e17b2f2b 100644
--- a/test/orm/test_collection.py
+++ b/test/orm/test_collection.py
@@ -175,7 +175,7 @@ class CollectionsTest(_base.ORMTest):
def invalid():
direct[slice(0, 6, 2)] = [creator()]
assert_raises(ValueError, invalid)
-
+
if hasattr(direct, '__delitem__'):
e = creator()
direct.append(e)
@@ -200,7 +200,7 @@ class CollectionsTest(_base.ORMTest):
del direct[::2]
del control[::2]
assert_eq()
-
+
if hasattr(direct, 'remove'):
e = creator()
direct.append(e)
@@ -209,21 +209,21 @@ class CollectionsTest(_base.ORMTest):
direct.remove(e)
control.remove(e)
assert_eq()
-
+
if hasattr(direct, '__setitem__') or hasattr(direct, '__setslice__'):
-
+
values = [creator(), creator()]
direct[:] = values
control[:] = values
assert_eq()
-
+
# test slice assignment where
# slice size goes over the number of items
values = [creator(), creator()]
direct[1:3] = values
control[1:3] = values
assert_eq()
-
+
values = [creator(), creator()]
direct[0:1] = values
control[0:1] = values
@@ -248,7 +248,7 @@ class CollectionsTest(_base.ORMTest):
direct[1::2] = values
control[1::2] = values
assert_eq()
-
+
values = [creator(), creator()]
direct[-1:-3] = values
control[-1:-3] = values
@@ -258,7 +258,7 @@ class CollectionsTest(_base.ORMTest):
direct[-2:-1] = values
control[-2:-1] = values
assert_eq()
-
+
if hasattr(direct, '__delitem__') or hasattr(direct, '__delslice__'):
for i in range(1, 4):
@@ -277,7 +277,7 @@ class CollectionsTest(_base.ORMTest):
del direct[:]
del control[:]
assert_eq()
-
+
if hasattr(direct, 'extend'):
values = [creator(), creator(), creator()]
@@ -377,7 +377,7 @@ class CollectionsTest(_base.ORMTest):
self._test_list_bulk(list)
def test_list_setitem_with_slices(self):
-
+
# this is a "list" that has no __setslice__
# or __delslice__ methods. The __setitem__
# and __delitem__ must therefore accept
@@ -1453,7 +1453,7 @@ class DictHelpersTest(_base.MappedTest):
p = session.query(Parent).get(pid)
-
+
eq_(set(p.children.keys()), set(['foo', 'bar']))
cid = p.children['foo'].id
@@ -1544,7 +1544,7 @@ class DictHelpersTest(_base.MappedTest):
def test_declarative_column_mapped(self):
"""test that uncompiled attribute usage works with column_mapped_collection"""
-
+
from sqlalchemy.ext.declarative import declarative_base
BaseObject = declarative_base()
@@ -1553,13 +1553,13 @@ class DictHelpersTest(_base.MappedTest):
__tablename__ = "foo"
id = Column(Integer(), primary_key=True, test_needs_autoincrement=True)
bar_id = Column(Integer, ForeignKey('bar.id'))
-
+
class Bar(BaseObject):
__tablename__ = "bar"
id = Column(Integer(), primary_key=True, test_needs_autoincrement=True)
foos = relationship(Foo, collection_class=collections.column_mapped_collection(Foo.id))
foos2 = relationship(Foo, collection_class=collections.column_mapped_collection((Foo.id, Foo.bar_id)))
-
+
eq_(Bar.foos.property.collection_class().keyfunc(Foo(id=3)), 3)
eq_(Bar.foos2.property.collection_class().keyfunc(Foo(id=3, bar_id=12)), (3, 12))
@@ -1574,8 +1574,8 @@ class DictHelpersTest(_base.MappedTest):
"for argument 'mapping_spec'; got: 'a'",
collections.column_mapped_collection,
text('a'))
-
-
+
+
@testing.resolve_artifact_names
def test_column_mapped_collection(self):
collection_class = collections.column_mapped_collection(
@@ -1760,9 +1760,9 @@ class CustomCollectionsTest(_base.MappedTest):
return self.data == other
def __repr__(self):
return 'ListLike(%s)' % repr(self.data)
-
+
self._test_list(ListLike)
-
+
@testing.resolve_artifact_names
def _test_list(self, listcls):
class Parent(object):
@@ -1801,7 +1801,7 @@ class CustomCollectionsTest(_base.MappedTest):
o = [Child()]
control[1:3] = o
-
+
p.children[1:3] = o
assert control == p.children
assert control == list(p.children)
diff --git a/test/orm/test_composites.py b/test/orm/test_composites.py
index 768d8636e..46d6bb44d 100644
--- a/test/orm/test_composites.py
+++ b/test/orm/test_composites.py
@@ -61,7 +61,7 @@ class PointTest(_base.MappedTest):
'start':sa.orm.composite(Point, edges.c.x1, edges.c.y1),
'end': sa.orm.composite(Point, edges.c.x2, edges.c.y2)
})
-
+
@testing.resolve_artifact_names
def _fixture(self):
sess = Session()
@@ -72,7 +72,7 @@ class PointTest(_base.MappedTest):
sess.add(g)
sess.commit()
return sess
-
+
@testing.resolve_artifact_names
def test_round_trip(self):
@@ -80,7 +80,7 @@ class PointTest(_base.MappedTest):
g1 = sess.query(Graph).first()
sess.close()
-
+
g = sess.query(Graph).get(g1.id)
eq_(
[(e.start, e.end) for e in g.edges],
@@ -88,40 +88,40 @@ class PointTest(_base.MappedTest):
(Point(3, 4), Point(5, 6)),
(Point(14, 5), Point(2, 7)),
]
- )
+ )
@testing.resolve_artifact_names
def test_detect_change(self):
sess = self._fixture()
-
+
g = sess.query(Graph).first()
g.edges[1].end = Point(18, 4)
sess.commit()
e = sess.query(Edge).get(g.edges[1].id)
eq_(e.end, Point(18, 4))
-
+
@testing.resolve_artifact_names
def test_eager_load(self):
sess = self._fixture()
g = sess.query(Graph).first()
sess.close()
-
+
def go():
g2 = sess.query(Graph).\
options(sa.orm.joinedload('edges')).\
get(g.id)
-
+
eq_(
[(e.start, e.end) for e in g2.edges],
[
(Point(3, 4), Point(5, 6)),
(Point(14, 5), Point(2, 7)),
]
- )
+ )
self.assert_sql_count(testing.db, go, 1)
-
+
@testing.resolve_artifact_names
def test_comparator(self):
sess = self._fixture()
@@ -149,12 +149,12 @@ class PointTest(_base.MappedTest):
sess.query(Edge.start, Edge.end).all(),
[(3, 4, 5, 6), (14, 5, 2, 7)]
)
-
+
@testing.resolve_artifact_names
def test_delete(self):
sess = self._fixture()
g = sess.query(Graph).first()
-
+
e = g.edges[1]
del e.end
sess.flush()
@@ -166,19 +166,19 @@ class PointTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_save_null(self):
"""test saving a null composite value
-
+
See google groups thread for more context:
http://groups.google.com/group/sqlalchemy/browse_thread/thread/0c6580a1761b2c29
-
+
"""
sess = Session()
g = Graph(id=1)
e = Edge(None, None)
g.edges.append(e)
-
+
sess.add(g)
sess.commit()
-
+
g2 = sess.query(Graph).get(1)
assert g2.edges[-1].start.x is None
assert g2.edges[-1].start.y is None
@@ -191,12 +191,12 @@ class PointTest(_base.MappedTest):
sess.expire(e)
assert 'start' not in e.__dict__
assert e.start == Point(3, 4)
-
+
@testing.resolve_artifact_names
def test_default_value(self):
e = Edge()
eq_(e.start, None)
-
+
class PrimaryKeyTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -205,7 +205,7 @@ class PrimaryKeyTest(_base.MappedTest):
test_needs_autoincrement=True),
Column('version_id', Integer, primary_key=True, nullable=True),
Column('name', String(30)))
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
@@ -229,7 +229,7 @@ class PrimaryKeyTest(_base.MappedTest):
mapper(Graph, graphs, properties={
'version':sa.orm.composite(Version, graphs.c.id,
graphs.c.version_id)})
-
+
@testing.resolve_artifact_names
def _fixture(self):
@@ -238,13 +238,13 @@ class PrimaryKeyTest(_base.MappedTest):
sess.add(g)
sess.commit()
return sess
-
+
@testing.resolve_artifact_names
def test_get_by_col(self):
sess = self._fixture()
g = sess.query(Graph).first()
-
+
g2 = sess.query(Graph).get([g.id, g.version_id])
eq_(g.version, g2.version)
@@ -252,7 +252,7 @@ class PrimaryKeyTest(_base.MappedTest):
def test_get_by_composite(self):
sess = self._fixture()
g = sess.query(Graph).first()
-
+
g2 = sess.query(Graph).get(Version(g.id, g.version_id))
eq_(g.version, g2.version)
@@ -272,7 +272,7 @@ class PrimaryKeyTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_null_pk(self):
sess = Session()
-
+
# test pk with one column NULL
# only sqlite can really handle this
g = Graph(Version(2, None))
@@ -280,7 +280,7 @@ class PrimaryKeyTest(_base.MappedTest):
sess.commit()
g2 = sess.query(Graph).filter_by(version=Version(2, None)).one()
eq_(g.version, g2.version)
-
+
class DefaultsTest(_base.MappedTest):
@classmethod
@@ -323,7 +323,7 @@ class DefaultsTest(_base.MappedTest):
foobars.c.x3,
foobars.c.x4)
))
-
+
@testing.resolve_artifact_names
def test_attributes_with_defaults(self):
@@ -334,12 +334,12 @@ class DefaultsTest(_base.MappedTest):
sess.flush()
assert f1.foob == FBComposite(2, 5, 15, None)
-
+
f2 = Foobar()
sess.add(f2)
sess.flush()
assert f2.foob == FBComposite(2, None, 15, None)
-
+
@testing.resolve_artifact_names
def test_set_composite_values(self):
sess = Session()
@@ -347,9 +347,9 @@ class DefaultsTest(_base.MappedTest):
f1.foob = FBComposite(None, 5, None, None)
sess.add(f1)
sess.flush()
-
+
assert f1.foob == FBComposite(2, 5, 15, None)
-
+
class MappedSelectTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -367,7 +367,7 @@ class MappedSelectTest(_base.MappedTest):
Column('v1', String(20)),
Column('v2', String(20)),
)
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
@@ -404,7 +404,7 @@ class MappedSelectTest(_base.MappedTest):
desc_values.c.v2),
})
-
+
@testing.resolve_artifact_names
def test_set_composite_attrs_via_selectable(self):
session = Session()
diff --git a/test/orm/test_cycles.py b/test/orm/test_cycles.py
index e5e657933..6aa1eaa1a 100644
--- a/test/orm/test_cycles.py
+++ b/test/orm/test_cycles.py
@@ -65,7 +65,7 @@ class SelfReferentialTest(_base.MappedTest):
test that the circular dependency sort can assemble a many-to-one
dependency processor when only the object on the "many" side is
- actually in the list of modified objects.
+ actually in the list of modified objects.
"""
mapper(C1, t1, properties={
@@ -111,7 +111,7 @@ class SelfReferentialTest(_base.MappedTest):
mapper(C1, t1, properties={
'children':relationship(C1)
})
-
+
sess = create_session()
c1 = C1()
c2 = C1()
@@ -119,14 +119,14 @@ class SelfReferentialTest(_base.MappedTest):
sess.add(c1)
sess.flush()
assert c2.parent_c1 == c1.c1
-
+
sess.delete(c1)
sess.flush()
assert c2.parent_c1 is None
-
+
sess.expire_all()
assert c2.parent_c1 is None
-
+
class SelfReferentialNoPKTest(_base.MappedTest):
"""A self-referential relationship that joins on a column other than the primary key column"""
@@ -300,7 +300,7 @@ class InheritTestTwo(_base.MappedTest):
class BiDirectionalManyToOneTest(_base.MappedTest):
run_define_tables = 'each'
-
+
@classmethod
def define_tables(cls, metadata):
Table('t1', metadata,
@@ -517,7 +517,7 @@ class OneToManyManyToOneTest(_base.MappedTest):
"""
run_define_tables = 'each'
-
+
@classmethod
def define_tables(cls, metadata):
Table('ball', metadata,
@@ -618,7 +618,7 @@ class OneToManyManyToOneTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_post_update_backref(self):
"""test bidirectional post_update."""
-
+
mapper(Ball, ball)
mapper(Person, person, properties=dict(
balls=relationship(Ball,
@@ -629,20 +629,20 @@ class OneToManyManyToOneTest(_base.MappedTest):
favorite=relationship(Ball,
primaryjoin=person.c.favorite_ball_id == ball.c.id,
remote_side=person.c.favorite_ball_id)
-
+
))
-
+
sess = sessionmaker()()
p1 = Person(data='p1')
p2 = Person(data='p2')
p3 = Person(data='p3')
-
+
b1 = Ball(data='b1')
-
+
b1.person = p1
sess.add_all([p1, p2, p3])
sess.commit()
-
+
# switch here. the post_update
# on ball.person can't get tripped up
# by the fact that there's a "reverse" prop.
@@ -658,7 +658,7 @@ class OneToManyManyToOneTest(_base.MappedTest):
eq_(
p3, b1.person
)
-
+
@testing.resolve_artifact_names
@@ -724,9 +724,9 @@ class OneToManyManyToOneTest(_base.MappedTest):
),
)
-
+
sess.delete(p)
-
+
self.assert_sql_execution(testing.db, sess.flush,
CompiledSQL("UPDATE ball SET person_id=:person_id "
"WHERE ball.id = :ball_id",
@@ -750,8 +750,8 @@ class OneToManyManyToOneTest(_base.MappedTest):
class SelfReferentialPostUpdateTest(_base.MappedTest):
"""Post_update on a single self-referential mapper.
-
-
+
+
"""
@classmethod
@@ -835,7 +835,7 @@ class SelfReferentialPostUpdateTest(_base.MappedTest):
session.flush()
remove_child(root, cats)
-
+
# pre-trigger lazy loader on 'cats' to make the test easier
cats.children
self.assert_sql_execution(
@@ -854,7 +854,7 @@ class SelfReferentialPostUpdateTest(_base.MappedTest):
"WHERE node.id = :node_id",
lambda ctx:{'next_sibling_id':None, 'node_id':cats.id}),
),
-
+
CompiledSQL("DELETE FROM node WHERE node.id = :id",
lambda ctx:[{'id':cats.id}])
)
@@ -981,7 +981,7 @@ class SelfReferentialPostUpdateTest3(_base.MappedTest):
mapper(Child, child, properties={
'parent':relationship(Child, remote_side=child.c.id)
})
-
+
session = create_session()
p1 = Parent('p1')
c1 = Child('c1')
@@ -989,7 +989,7 @@ class SelfReferentialPostUpdateTest3(_base.MappedTest):
p1.children =[c1, c2]
c2.parent = c1
p1.child = c2
-
+
session.add_all([p1, c1, c2])
session.flush()
@@ -998,18 +998,18 @@ class SelfReferentialPostUpdateTest3(_base.MappedTest):
p2.children = [c3]
p2.child = c3
session.add(p2)
-
+
session.delete(c2)
p1.children.remove(c2)
p1.child = None
session.flush()
-
+
p2.child = None
session.flush()
-
+
class PostUpdateBatchingTest(_base.MappedTest):
"""test that lots of post update cols batch together into a single UPDATE."""
-
+
@classmethod
def define_tables(cls, metadata):
Table('parent', metadata,
@@ -1037,7 +1037,7 @@ class PostUpdateBatchingTest(_base.MappedTest):
Column('name', String(50), nullable=False),
Column('parent_id', Integer,
ForeignKey('parent.id'), nullable=False))
-
+
Table('child3', metadata,
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
@@ -1059,14 +1059,14 @@ class PostUpdateBatchingTest(_base.MappedTest):
class Child3(_base.BasicEntity):
def __init__(self, name=''):
self.name = name
-
+
@testing.resolve_artifact_names
def test_one(self):
mapper(Parent, parent, properties={
'c1s':relationship(Child1, primaryjoin=child1.c.parent_id==parent.c.id),
'c2s':relationship(Child2, primaryjoin=child2.c.parent_id==parent.c.id),
'c3s':relationship(Child3, primaryjoin=child3.c.parent_id==parent.c.id),
-
+
'c1':relationship(Child1, primaryjoin=child1.c.id==parent.c.c1_id, post_update=True),
'c2':relationship(Child2, primaryjoin=child2.c.id==parent.c.c2_id, post_update=True),
'c3':relationship(Child3, primaryjoin=child3.c.id==parent.c.c3_id, post_update=True),
@@ -1074,20 +1074,20 @@ class PostUpdateBatchingTest(_base.MappedTest):
mapper(Child1, child1)
mapper(Child2, child2)
mapper(Child3, child3)
-
+
sess = create_session()
-
+
p1 = Parent('p1')
c11, c12, c13 = Child1('c1'), Child1('c2'), Child1('c3')
c21, c22, c23 = Child2('c1'), Child2('c2'), Child2('c3')
c31, c32, c33 = Child3('c1'), Child3('c2'), Child3('c3')
-
+
p1.c1s = [c11, c12, c13]
p1.c2s = [c21, c22, c23]
p1.c3s = [c31, c32, c33]
sess.add(p1)
sess.flush()
-
+
p1.c1 = c12
p1.c2 = c23
p1.c3 = c31
@@ -1113,4 +1113,3 @@ class PostUpdateBatchingTest(_base.MappedTest):
lambda ctx: {'c2_id': None, 'parent_id': p1.id, 'c1_id': None, 'c3_id': None}
)
)
- \ No newline at end of file
diff --git a/test/orm/test_defaults.py b/test/orm/test_defaults.py
index f7e39a4fb..004a401c7 100644
--- a/test/orm/test_defaults.py
+++ b/test/orm/test_defaults.py
@@ -47,7 +47,7 @@ class TriggerDefaultsTest(_base.MappedTest):
),
):
event.listen(dt, 'after_create', ins)
-
+
event.listen(dt, 'before_drop', sa.DDL("DROP TRIGGER dt_ins"))
for up in (
@@ -128,16 +128,16 @@ class ExcludedDefaultsTest(_base.MappedTest):
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('col1', String(20), default="hello"),
)
-
+
@testing.resolve_artifact_names
def test_exclude(self):
class Foo(_base.ComparableEntity):
pass
mapper(Foo, dt, exclude_properties=('col1',))
-
+
f1 = Foo()
sess = create_session()
sess.add(f1)
sess.flush()
eq_(dt.select().execute().fetchall(), [(1, "hello")])
-
+
diff --git a/test/orm/test_deprecations.py b/test/orm/test_deprecations.py
index 2565105a6..400532cb2 100644
--- a/test/orm/test_deprecations.py
+++ b/test/orm/test_deprecations.py
@@ -97,9 +97,9 @@ class QueryAlternativesTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_override_get(self):
"""MapperExtension.get()
-
+
x = session.query.get(5)
-
+
"""
from sqlalchemy.orm.query import Query
cache = {}
@@ -111,25 +111,25 @@ class QueryAlternativesTest(_base.MappedTest):
x = super(MyQuery, self).get(ident)
cache[ident] = x
return x
-
+
session = sessionmaker(query_cls=MyQuery)()
-
+
ad1 = session.query(Address).get(1)
assert ad1 in cache.values()
-
+
@testing.resolve_artifact_names
def test_load(self):
"""x = session.query(Address).load(1)
-
+
x = session.load(Address, 1)
-
+
"""
session = create_session()
ad1 = session.query(Address).populate_existing().get(1)
assert bool(ad1)
-
-
+
+
@testing.resolve_artifact_names
def test_apply_max(self):
"""Query.apply_max(col)
diff --git a/test/orm/test_descriptor.py b/test/orm/test_descriptor.py
index a09e13047..3ef4afa7f 100644
--- a/test/orm/test_descriptor.py
+++ b/test/orm/test_descriptor.py
@@ -19,69 +19,69 @@ class TestDescriptor(descriptor_props.DescriptorProperty):
self._comparator_factory = partial(comparator_factory, self)
else:
self._comparator_factory = lambda mapper: None
-
+
class DescriptorInstrumentationTest(_base.ORMTest):
def _fixture(self):
Base = declarative_base()
-
+
class Foo(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True)
-
+
return Foo
-
+
def test_fixture(self):
Foo = self._fixture()
-
+
d = TestDescriptor(Foo, 'foo')
d.instrument_class(Foo.__mapper__)
-
+
assert Foo.foo
def test_property_wrapped_classlevel(self):
Foo = self._fixture()
prop = property(lambda self:None)
Foo.foo = prop
-
+
d = TestDescriptor(Foo, 'foo')
d.instrument_class(Foo.__mapper__)
-
+
assert Foo().foo is None
assert Foo.foo is not prop
def test_property_subclass_wrapped_classlevel(self):
Foo = self._fixture()
-
+
class myprop(property):
attr = 'bar'
def method1(self):
return "method1"
-
+
def __getitem__(self, key):
return 'value'
prop = myprop(lambda self:None)
Foo.foo = prop
-
+
d = TestDescriptor(Foo, 'foo')
d.instrument_class(Foo.__mapper__)
-
+
assert Foo().foo is None
assert Foo.foo is not prop
assert Foo.foo.attr == 'bar'
assert Foo.foo.method1() == 'method1'
assert Foo.foo['bar'] == 'value'
-
+
def test_comparator(self):
class Comparator(PropComparator):
__hash__ = None
-
+
attr = 'bar'
-
+
def method1(self):
return "method1"
-
+
def method2(self, other):
return "method2"
@@ -104,7 +104,7 @@ class DescriptorInstrumentationTest(_base.ORMTest):
(Foo.foo == 'bar').__str__(),
"foo = upper(:upper_1)"
)
-
+
def test_aliased_comparator(self):
class Comparator(ColumnProperty.Comparator):
@@ -115,14 +115,14 @@ class DescriptorInstrumentationTest(_base.ORMTest):
Foo = self._fixture()
Foo._name = Column('name', String)
-
+
def comparator_factory(self, mapper):
prop = mapper._props['_name']
return Comparator(prop, mapper)
-
+
d = TestDescriptor(Foo, 'foo', comparator_factory=comparator_factory)
d.instrument_class(Foo.__mapper__)
-
+
eq_(
str(Foo.foo == 'ed'),
"foobar(foo.name) = foobar(:foobar_1)"
diff --git a/test/orm/test_dynamic.py b/test/orm/test_dynamic.py
index 0958d60dd..ff157407a 100644
--- a/test/orm/test_dynamic.py
+++ b/test/orm/test_dynamic.py
@@ -20,7 +20,7 @@ class DynamicTest(_fixtures.FixtureTest, AssertsCompiledSQL):
q = sess.query(User)
u = q.filter(User.id==7).first()
-
+
eq_([User(id=7,
addresses=[Address(id=1, email_address='jack@bean.com')])],
q.filter(User.id==7).all())
@@ -30,7 +30,7 @@ class DynamicTest(_fixtures.FixtureTest, AssertsCompiledSQL):
def test_statement(self):
"""test that the .statement accessor returns the actual statement that
would render, without any _clones called."""
-
+
mapper(User, users, properties={
'addresses':dynamic_loader(mapper(Address, addresses))
})
@@ -44,7 +44,7 @@ class DynamicTest(_fixtures.FixtureTest, AssertsCompiledSQL):
"addresses WHERE :param_1 = addresses.user_id",
use_default_dialect=True
)
-
+
@testing.resolve_artifact_names
def test_order_by(self):
mapper(User, users, properties={
@@ -133,7 +133,7 @@ class DynamicTest(_fixtures.FixtureTest, AssertsCompiledSQL):
"Dynamic attributes don't support collection population.",
attributes.set_committed_value, u1, 'addresses', []
)
-
+
@testing.resolve_artifact_names
def test_m2m(self):
mapper(Order, orders, properties={
@@ -178,8 +178,8 @@ class DynamicTest(_fixtures.FixtureTest, AssertsCompiledSQL):
o.items.filter(order_items.c.item_id==2).all(),
[Item(id=2)]
)
-
-
+
+
@testing.resolve_artifact_names
def test_transient_detached(self):
mapper(User, users, properties={
diff --git a/test/orm/test_eager_relations.py b/test/orm/test_eager_relations.py
index e3d14fede..095254b27 100644
--- a/test/orm/test_eager_relations.py
+++ b/test/orm/test_eager_relations.py
@@ -39,7 +39,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
sess = create_session()
sess.query(User).all()
m.add_property("addresses", relationship(mapper(Address, addresses)))
-
+
sess.expunge_all()
def go():
eq_(
@@ -47,12 +47,12 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
sess.query(User).options(joinedload('addresses')).filter(User.id==7).all()
)
self.assert_sql_count(testing.db, go, 1)
-
-
+
+
@testing.resolve_artifact_names
def test_no_orphan(self):
"""An eagerly loaded child object is not marked as an orphan"""
-
+
mapper(User, users, properties={
'addresses':relationship(Address, cascade="all,delete-orphan", lazy='joined')
})
@@ -114,7 +114,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
def test_orderby_related(self):
"""A regular mapper select on a single table can
order by a relationship to a second table"""
-
+
mapper(Address, addresses)
mapper(User, users, properties = dict(
addresses = relationship(Address, lazy='joined', order_by=addresses.c.id),
@@ -290,7 +290,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
@testing.resolve_artifact_names
def test_disable_dynamic(self):
"""test no joined option on a dynamic."""
-
+
mapper(User, users, properties={
'addresses':relationship(Address, lazy="dynamic")
})
@@ -368,10 +368,10 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
mapper(Address, addresses)
mapper(Order, orders)
-
+
open_mapper = mapper(Order, openorders, non_primary=True)
closed_mapper = mapper(Order, closedorders, non_primary=True)
-
+
mapper(User, users, properties = dict(
addresses = relationship(Address, lazy='joined', order_by=addresses.c.id),
open_orders = relationship(
@@ -628,12 +628,12 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
def test_useget_cancels_eager(self):
"""test that a one to many lazyload cancels the unnecessary
eager many-to-one join on the other side."""
-
+
mapper(User, users)
mapper(Address, addresses, properties={
'user':relationship(User, lazy='joined', backref='addresses')
})
-
+
sess = create_session()
u1 = sess.query(User).filter(User.id==8).one()
def go():
@@ -646,13 +646,13 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"addresses.user_id",
{'param_1': 8})
)
-
-
+
+
@testing.resolve_artifact_names
def test_manytoone_limit(self):
"""test that the subquery wrapping only occurs with
limit/offset and m2m or o2m joins present."""
-
+
mapper(User, users, properties=odict(
orders=relationship(Order, backref='user')
))
@@ -662,7 +662,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
))
mapper(Address, addresses)
mapper(Item, items)
-
+
sess = create_session()
self.assert_compile(
@@ -740,7 +740,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
{'param_1':10},
use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(User).options(joinedload("orders", innerjoin=True),
joinedload("orders.address", innerjoin=True)).limit(10),
@@ -756,7 +756,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
{'param_1':10},
use_default_dialect=True
)
-
+
@testing.resolve_artifact_names
def test_one_to_many_scalar(self):
mapper(User, users, properties = dict(
@@ -790,9 +790,9 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
def test_many_to_one_null(self):
"""test that a many-to-one eager load which loads None does
not later trigger a lazy load.
-
+
"""
-
+
# use a primaryjoin intended to defeat SA's usage of
# query.get() for a many-to-one lazyload
mapper(Order, orders, properties = dict(
@@ -801,7 +801,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
addresses.c.id==orders.c.address_id,
addresses.c.email_address != None
),
-
+
lazy='joined')
))
sess = create_session()
@@ -810,13 +810,13 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
o1 = sess.query(Order).options(lazyload('address')).filter(Order.id==5).one()
eq_(o1.address, None)
self.assert_sql_count(testing.db, go, 2)
-
+
sess.expunge_all()
def go():
o1 = sess.query(Order).filter(Order.id==5).one()
eq_(o1.address, None)
self.assert_sql_count(testing.db, go, 1)
-
+
@testing.resolve_artifact_names
def test_one_and_many(self):
"""tests eager load for a parent object with a child object that
@@ -879,7 +879,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
def test_uselist_false_warning(self):
"""test that multiple rows received by a
uselist=False raises a warning."""
-
+
mapper(User, users, properties={
'order':relationship(Order, uselist=False)
})
@@ -887,7 +887,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
s = create_session()
assert_raises(sa.exc.SAWarning,
s.query(User).options(joinedload(User.order)).all)
-
+
@testing.resolve_artifact_names
def test_wide(self):
mapper(Order, orders, properties={'items':relationship(Item, secondary=order_items, lazy='joined',
@@ -972,7 +972,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
innerjoin=True)
))
mapper(Item, items)
-
+
sess = create_session()
self.assert_compile(
sess.query(User),
@@ -986,7 +986,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"order_items_1.item_id",
use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(User).options(joinedload(User.orders, innerjoin=False)),
"SELECT users.id AS users_id, users.name AS users_name, items_1.id AS "
@@ -1012,7 +1012,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"order_items_1.item_id",
use_default_dialect=True
)
-
+
@testing.resolve_artifact_names
def test_inner_join_chaining_fixed(self):
mapper(User, users, properties = dict(
@@ -1023,7 +1023,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
innerjoin=True)
))
mapper(Item, items)
-
+
sess = create_session()
# joining from user, its all LEFT OUTER JOINs
@@ -1039,7 +1039,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"order_items_1.item_id",
use_default_dialect=True
)
-
+
# joining just from Order, innerjoin=True can be respected
self.assert_compile(
sess.query(Order),
@@ -1052,8 +1052,8 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"order_items_1.item_id",
use_default_dialect=True
)
-
-
+
+
@testing.resolve_artifact_names
def test_inner_join_options(self):
@@ -1081,14 +1081,14 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"order_items_1 ON orders_1.id = order_items_1.order_id JOIN items AS items_1 ON "
"items_1.id = order_items_1.item_id ORDER BY orders_1.id, items_1.id"
, use_default_dialect=True)
-
+
def go():
eq_(
sess.query(User).options(
joinedload(User.orders, innerjoin=True),
joinedload(User.orders, Order.items, innerjoin=True)).
order_by(User.id).all(),
-
+
[User(id=7,
orders=[
Order(id=1, items=[ Item(id=1), Item(id=2), Item(id=3)]),
@@ -1100,7 +1100,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
]
)
self.assert_sql_count(testing.db, go, 1)
-
+
# test that default innerjoin setting is used for options
self.assert_compile(
sess.query(Order).options(joinedload(Order.user)).filter(Order.description == 'foo'),
@@ -1111,7 +1111,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"WHERE orders.description = :description_1",
use_default_dialect=True
)
-
+
class AddEntityTest(_fixtures.FixtureTest):
run_inserts = 'once'
run_deletes = None
@@ -1511,7 +1511,7 @@ class MixedSelfReferentialEagerTest(_base.MappedTest):
pass
class B(_base.ComparableEntity):
pass
-
+
mapper(A,a_table)
mapper(B,b_table,properties = {
'parent_b1': relationship(B,
@@ -1526,7 +1526,7 @@ class MixedSelfReferentialEagerTest(_base.MappedTest):
order_by = b_table.c.id
)
});
-
+
@classmethod
@testing.resolve_artifact_names
def insert_data(cls):
@@ -1547,7 +1547,7 @@ class MixedSelfReferentialEagerTest(_base.MappedTest):
dict(id=13, parent_a_id=3, parent_b1_id=4, parent_b2_id=4),
dict(id=14, parent_a_id=3, parent_b1_id=7, parent_b2_id=2),
)
-
+
@testing.resolve_artifact_names
def test_eager_load(self):
session = create_session()
@@ -1566,7 +1566,7 @@ class MixedSelfReferentialEagerTest(_base.MappedTest):
]
)
self.assert_sql_count(testing.db, go, 1)
-
+
class SelfReferentialM2MEagerTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -1659,7 +1659,7 @@ class MixedEntitiesTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
@testing.resolve_artifact_names
def test_two_entities_with_joins(self):
sess = create_session()
-
+
# two FROM clauses where there's a join on each one
def go():
u1 = aliased(User)
@@ -1694,8 +1694,8 @@ class MixedEntitiesTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
order_by(User.id, Order.id, u1.id, o1.id).all(),
)
self.assert_sql_count(testing.db, go, 1)
-
-
+
+
@testing.resolve_artifact_names
def test_aliased_entity(self):
@@ -1871,18 +1871,18 @@ class SubqueryTest(_base.MappedTest):
class CorrelatedSubqueryTest(_base.MappedTest):
"""tests for #946, #947, #948.
-
+
The "users" table is joined to "stuff", and the relationship
would like to pull only the "stuff" entry with the most recent date.
-
+
Exercises a variety of ways to configure this.
-
+
"""
# another argument for joinedload learning about inner joins
-
+
__requires__ = ('correlated_outer_joins', )
-
+
@classmethod
def define_tables(cls, metadata):
users = Table('users', metadata,
@@ -1894,7 +1894,7 @@ class CorrelatedSubqueryTest(_base.MappedTest):
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('date', Date),
Column('user_id', Integer, ForeignKey('users.id')))
-
+
@classmethod
@testing.resolve_artifact_names
def insert_data(cls):
@@ -1912,8 +1912,8 @@ class CorrelatedSubqueryTest(_base.MappedTest):
{'id':5, 'user_id':3, 'date':datetime.date(2007, 6, 15)},
{'id':6, 'user_id':3, 'date':datetime.date(2007, 3, 15)},
)
-
-
+
+
def test_labeled_on_date_noalias(self):
self._do_test('label', True, False)
@@ -1949,7 +1949,7 @@ class CorrelatedSubqueryTest(_base.MappedTest):
def test_plain_on_limitid_alias(self):
self._do_test('none', False, True)
-
+
@testing.resolve_artifact_names
def _do_test(self, labeled, ondate, aliasstuff):
class User(_base.ComparableEntity):
@@ -1957,7 +1957,7 @@ class CorrelatedSubqueryTest(_base.MappedTest):
class Stuff(_base.ComparableEntity):
pass
-
+
mapper(Stuff, stuff)
if aliasstuff:
@@ -1991,7 +1991,7 @@ class CorrelatedSubqueryTest(_base.MappedTest):
mapper(User, users, properties={
'stuff':relationship(Stuff, primaryjoin=and_(users.c.id==stuff.c.user_id, stuff.c.id==stuff_view))
})
-
+
sess = create_session()
def go():
eq_(
@@ -2003,7 +2003,7 @@ class CorrelatedSubqueryTest(_base.MappedTest):
]
)
self.assert_sql_count(testing.db, go, 1)
-
+
sess = create_session()
def go():
eq_(
diff --git a/test/orm/test_evaluator.py b/test/orm/test_evaluator.py
index 26f9f49c3..017619cfe 100644
--- a/test/orm/test_evaluator.py
+++ b/test/orm/test_evaluator.py
@@ -27,17 +27,17 @@ class EvaluateTest(_base.MappedTest):
Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(64)))
-
+
@classmethod
def setup_classes(cls):
class User(_base.ComparableEntity):
pass
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
mapper(User, users)
-
+
@testing.resolve_artifact_names
def test_compare_to_value(self):
eval_eq(User.name == 'foo', testcases=[
@@ -45,20 +45,20 @@ class EvaluateTest(_base.MappedTest):
(User(name='bar'), False),
(User(name=None), None),
])
-
+
eval_eq(User.id < 5, testcases=[
(User(id=3), True),
(User(id=5), False),
(User(id=None), None),
])
-
+
@testing.resolve_artifact_names
def test_compare_to_none(self):
eval_eq(User.name == None, testcases=[
(User(name='foo'), False),
(User(name=None), True),
])
-
+
@testing.resolve_artifact_names
def test_boolean_ops(self):
eval_eq(and_(User.name == 'foo', User.id == 1), testcases=[
@@ -68,7 +68,7 @@ class EvaluateTest(_base.MappedTest):
(User(id=2, name='bar'), False),
(User(id=1, name=None), None),
])
-
+
eval_eq(or_(User.name == 'foo', User.id == 1), testcases=[
(User(id=1, name='foo'), True),
(User(id=2, name='foo'), True),
@@ -77,7 +77,7 @@ class EvaluateTest(_base.MappedTest):
(User(id=1, name=None), True),
(User(id=2, name=None), None),
])
-
+
eval_eq(not_(User.id == 1), testcases=[
(User(id=1), False),
(User(id=2), True),
diff --git a/test/orm/test_events.py b/test/orm/test_events.py
index b2900c93f..25f94e487 100644
--- a/test/orm/test_events.py
+++ b/test/orm/test_events.py
@@ -21,27 +21,27 @@ class _RemoveListeners(object):
ClassManager.dispatch._clear()
Session.dispatch._clear()
super(_RemoveListeners, self).teardown()
-
+
class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
run_inserts = None
-
+
@testing.resolve_artifact_names
def test_instance_event_listen(self):
"""test listen targets for instance events"""
-
+
canary = []
class A(object):
pass
class B(A):
pass
-
+
mapper(A, users)
mapper(B, addresses, inherits=A)
-
+
def init_a(target, args, kwargs):
canary.append(('init_a', target))
-
+
def init_b(target, args, kwargs):
canary.append(('init_b', target))
@@ -53,30 +53,30 @@ class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
def init_e(target, args, kwargs):
canary.append(('init_e', target))
-
+
event.listen(mapper, 'init', init_a)
event.listen(Mapper, 'init', init_b)
event.listen(class_mapper(A), 'init', init_c)
event.listen(A, 'init', init_d)
event.listen(A, 'init', init_e, propagate=True)
-
+
a = A()
eq_(canary, [('init_a', a),('init_b', a),
('init_c', a),('init_d', a),('init_e', a)])
-
+
# test propagate flag
canary[:] = []
b = B()
eq_(canary, [('init_a', b), ('init_b', b),('init_e', b)])
-
-
+
+
def listen_all(self, mapper, **kw):
canary = []
def evt(meth):
def go(*args, **kwargs):
canary.append(meth)
return go
-
+
for meth in [
'init',
'init_failure',
@@ -102,7 +102,7 @@ class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
mapper(User, users)
canary = self.listen_all(User)
-
+
sess = create_session()
u = User(name='u1')
sess.add(u)
@@ -164,16 +164,16 @@ class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
def test_before_after_only_collection(self):
"""before_update is called on parent for collection modifications,
after_update is called even if no columns were updated.
-
+
"""
mapper(Item, items, properties={
'keywords': relationship(Keyword, secondary=item_keywords)})
mapper(Keyword, keywords)
-
+
canary1 = self.listen_all(Item)
canary2 = self.listen_all(Keyword)
-
+
sess = create_session()
i1 = Item(description="i1")
k1 = Keyword(name="k1")
@@ -195,14 +195,14 @@ class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
eq_(canary1, ['before_update', 'after_update'])
eq_(canary2, [])
-
+
@testing.resolve_artifact_names
def test_retval(self):
def create_instance(mapper, context, row, class_):
u = User.__new__(User)
u.foo = True
return u
-
+
mapper(User, users)
event.listen(User, 'create_instance', create_instance, retval=True)
sess = create_session()
@@ -213,20 +213,20 @@ class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
sess.expunge_all()
u = sess.query(User).first()
assert u.foo
-
+
@testing.resolve_artifact_names
def test_instrument_event(self):
canary = []
def instrument_class(mapper, cls):
canary.append(cls)
-
+
event.listen(Mapper, 'instrument_class', instrument_class)
-
+
mapper(User, users)
eq_(canary, [User])
mapper(Address, addresses)
eq_(canary, [User, Address])
-
+
class LoadTest(_fixtures.FixtureTest):
run_inserts = None
@@ -235,7 +235,7 @@ class LoadTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def setup_mappers(cls):
mapper(User, users)
-
+
@testing.resolve_artifact_names
def _fixture(self):
canary = []
@@ -243,7 +243,7 @@ class LoadTest(_fixtures.FixtureTest):
canary.append("load")
def refresh(target, ctx, attrs):
canary.append(("refresh", attrs))
-
+
event.listen(User, "load", load)
event.listen(User, "refresh", refresh)
return canary
@@ -251,33 +251,33 @@ class LoadTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_just_loaded(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.commit()
sess.close()
-
+
sess.query(User).first()
eq_(canary, ['load'])
@testing.resolve_artifact_names
def test_repeated_rows(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.commit()
sess.close()
-
+
sess.query(User).union_all(sess.query(User)).all()
eq_(canary, ['load'])
-
-
-
+
+
+
class RefreshTest(_fixtures.FixtureTest):
run_inserts = None
@@ -285,7 +285,7 @@ class RefreshTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def setup_mappers(cls):
mapper(User, users)
-
+
@testing.resolve_artifact_names
def _fixture(self):
canary = []
@@ -293,7 +293,7 @@ class RefreshTest(_fixtures.FixtureTest):
canary.append("load")
def refresh(target, ctx, attrs):
canary.append(("refresh", attrs))
-
+
event.listen(User, "load", load)
event.listen(User, "refresh", refresh)
return canary
@@ -301,96 +301,96 @@ class RefreshTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_already_present(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.flush()
-
+
sess.query(User).first()
eq_(canary, [])
@testing.resolve_artifact_names
def test_repeated_rows(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.commit()
-
+
sess.query(User).union_all(sess.query(User)).all()
eq_(canary, [('refresh', set(['id','name']))])
@testing.resolve_artifact_names
def test_via_refresh_state(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.commit()
-
+
u1.name
eq_(canary, [('refresh', set(['id','name']))])
@testing.resolve_artifact_names
def test_was_expired(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.flush()
sess.expire(u1)
-
+
sess.query(User).first()
eq_(canary, [('refresh', set(['id','name']))])
@testing.resolve_artifact_names
def test_was_expired_via_commit(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.commit()
-
+
sess.query(User).first()
eq_(canary, [('refresh', set(['id','name']))])
@testing.resolve_artifact_names
def test_was_expired_attrs(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.flush()
sess.expire(u1, ['name'])
-
+
sess.query(User).first()
eq_(canary, [('refresh', set(['name']))])
-
+
@testing.resolve_artifact_names
def test_populate_existing(self):
canary = self._fixture()
-
+
sess = Session()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.commit()
-
+
sess.query(User).populate_existing().first()
eq_(canary, [('refresh', None)])
-
+
class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
run_inserts = None
@@ -398,42 +398,42 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
def test_class_listen(self):
def my_listener(*arg, **kw):
pass
-
+
event.listen(Session, 'before_flush', my_listener)
-
+
s = Session()
assert my_listener in s.dispatch.before_flush
-
+
def test_sessionmaker_listen(self):
"""test that listen can be applied to individual scoped_session() classes."""
-
+
def my_listener_one(*arg, **kw):
pass
def my_listener_two(*arg, **kw):
pass
-
+
S1 = sessionmaker()
S2 = sessionmaker()
-
+
event.listen(Session, 'before_flush', my_listener_one)
event.listen(S1, 'before_flush', my_listener_two)
-
+
s1 = S1()
assert my_listener_one in s1.dispatch.before_flush
assert my_listener_two in s1.dispatch.before_flush
-
+
s2 = S2()
assert my_listener_one in s2.dispatch.before_flush
assert my_listener_two not in s2.dispatch.before_flush
-
+
def test_scoped_session_invalid_callable(self):
from sqlalchemy.orm import scoped_session
-
+
def my_listener_one(*arg, **kw):
pass
-
+
scope = scoped_session(lambda:Session())
-
+
assert_raises_message(
sa.exc.ArgumentError,
"Session event listen on a ScopedSession "
@@ -443,41 +443,41 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
def test_scoped_session_invalid_class(self):
from sqlalchemy.orm import scoped_session
-
+
def my_listener_one(*arg, **kw):
pass
-
+
class NotASession(object):
def __call__(self):
return Session()
-
+
scope = scoped_session(NotASession)
-
+
assert_raises_message(
sa.exc.ArgumentError,
"Session event listen on a ScopedSession "
"requries that its creation callable is a Session subclass.",
event.listen, scope, "before_flush", my_listener_one
)
-
+
def test_scoped_session_listen(self):
from sqlalchemy.orm import scoped_session
-
+
def my_listener_one(*arg, **kw):
pass
-
+
scope = scoped_session(sessionmaker())
event.listen(scope, "before_flush", my_listener_one)
-
+
assert my_listener_one in scope().dispatch.before_flush
-
+
def _listener_fixture(self, **kw):
canary = []
def listener(name):
def go(*arg, **kw):
canary.append(name)
return go
-
+
sess = Session(**kw)
for evt in [
@@ -493,16 +493,16 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
'after_bulk_delete'
]:
event.listen(sess, evt, listener(evt))
-
+
return sess, canary
-
+
@testing.resolve_artifact_names
def test_flush_autocommit_hook(self):
-
+
mapper(User, users)
sess, canary = self._listener_fixture(autoflush=False, autocommit=True)
-
+
u = User(name='u1')
sess.add(u)
sess.flush()
@@ -524,7 +524,7 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
sess.flush()
eq_(canary, ['after_attach', 'before_flush', 'after_begin',
'after_flush', 'after_flush_postexec'])
-
+
@testing.resolve_artifact_names
def test_flush_in_commit_hook(self):
sess, canary = self._listener_fixture()
@@ -534,17 +534,17 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
sess.add(u)
sess.flush()
canary[:] = []
-
+
u.name = 'ed'
sess.commit()
eq_(canary, ['before_commit', 'before_flush', 'after_flush',
'after_flush_postexec', 'after_commit'])
-
+
def test_standalone_on_commit_hook(self):
sess, canary = self._listener_fixture()
sess.commit()
eq_(canary, ['before_commit', 'after_commit'])
-
+
@testing.resolve_artifact_names
def test_on_bulk_update_hook(self):
sess, canary = self._listener_fixture()
@@ -558,7 +558,7 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
mapper(User, users)
sess.query(User).delete()
eq_(canary, ['after_begin', 'after_bulk_delete'])
-
+
def test_connection_emits_after_begin(self):
sess, canary = self._listener_fixture(bind=testing.db)
conn = sess.connection()
@@ -571,7 +571,7 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
def before_flush(session, flush_context, objects):
session.flush()
-
+
sess = Session()
event.listen(sess, 'before_flush', before_flush)
sess.add(User(name='foo'))
@@ -580,9 +580,9 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_before_flush_affects_flush_plan(self):
-
+
mapper(User, users)
-
+
def before_flush(session, flush_context, objects):
for obj in list(session.new) + list(session.dirty):
if isinstance(obj, User):
@@ -592,7 +592,7 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
x = session.query(User).filter(User.name
== 'another %s' % obj.name).one()
session.delete(x)
-
+
sess = Session()
event.listen(sess, 'before_flush', before_flush)
@@ -605,7 +605,7 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
User(name='u1')
]
)
-
+
sess.flush()
eq_(sess.query(User).order_by(User.name).all(),
[
@@ -635,21 +635,21 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_before_flush_affects_dirty(self):
mapper(User, users)
-
+
def before_flush(session, flush_context, objects):
for obj in list(session.identity_map.values()):
obj.name += " modified"
-
+
sess = Session(autoflush=True)
event.listen(sess, 'before_flush', before_flush)
-
+
u = User(name='u1')
sess.add(u)
sess.flush()
eq_(sess.query(User).order_by(User.name).all(),
[User(name='u1')]
)
-
+
sess.add(User(name='u2'))
sess.flush()
sess.expunge_all()
@@ -659,15 +659,15 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
User(name='u2')
]
)
-
-
+
+
class MapperExtensionTest(_fixtures.FixtureTest):
"""Superceded by MapperEventsTest - test backwards
compatiblity of MapperExtension."""
-
+
run_inserts = None
-
+
def extension(self):
methods = []
@@ -787,7 +787,7 @@ class MapperExtensionTest(_fixtures.FixtureTest):
def test_before_after_only_collection(self):
"""before_update is called on parent for collection modifications,
after_update is called even if no columns were updated.
-
+
"""
Ext1, methods1 = self.extension()
@@ -848,13 +848,13 @@ class MapperExtensionTest(_fixtures.FixtureTest):
'create_instance', 'populate_instance', 'reconstruct_instance',
'append_result', 'before_update', 'after_update', 'before_delete',
'after_delete'])
-
+
@testing.resolve_artifact_names
def test_create_instance(self):
class CreateUserExt(sa.orm.MapperExtension):
def create_instance(self, mapper, selectcontext, row, class_):
return User.__new__(User)
-
+
mapper(User, users, extension=CreateUserExt())
sess = create_session()
u1 = User()
@@ -873,30 +873,30 @@ class AttributeExtensionTest(_base.MappedTest):
Column('id', Integer, primary_key=True),
Column('type', String(40)),
Column('data', String(50))
-
+
)
@testing.resolve_artifact_names
def test_cascading_extensions(self):
ext_msg = []
-
+
class Ex1(sa.orm.AttributeExtension):
def set(self, state, value, oldvalue, initiator):
ext_msg.append("Ex1 %r" % value)
return "ex1" + value
-
+
class Ex2(sa.orm.AttributeExtension):
def set(self, state, value, oldvalue, initiator):
ext_msg.append("Ex2 %r" % value)
return "ex2" + value
-
+
class A(_base.BasicEntity):
pass
class B(A):
pass
class C(B):
pass
-
+
mapper(A, t1, polymorphic_on=t1.c.type, polymorphic_identity='a', properties={
'data':column_property(t1.c.data, extension=Ex1())
})
@@ -904,26 +904,26 @@ class AttributeExtensionTest(_base.MappedTest):
mc = mapper(C, polymorphic_identity='c', inherits=B, properties={
'data':column_property(t1.c.data, extension=Ex2())
})
-
+
a1 = A(data='a1')
b1 = B(data='b1')
c1 = C(data='c1')
-
+
eq_(a1.data, 'ex1a1')
eq_(b1.data, 'ex1b1')
eq_(c1.data, 'ex2c1')
-
+
a1.data = 'a2'
b1.data='b2'
c1.data = 'c2'
eq_(a1.data, 'ex1a2')
eq_(b1.data, 'ex1b2')
eq_(c1.data, 'ex2c2')
-
+
eq_(ext_msg, ["Ex1 'a1'", "Ex1 'b1'", "Ex2 'c1'",
"Ex1 'a2'", "Ex1 'b2'", "Ex2 'c2'"])
-
+
class SessionExtensionTest(_fixtures.FixtureTest):
run_inserts = None
@@ -1013,7 +1013,7 @@ class SessionExtensionTest(_fixtures.FixtureTest):
class MyExt1(sa.orm.session.SessionExtension):
def before_commit(self, session):
log.append('before_commit_one')
-
+
class MyExt2(sa.orm.session.SessionExtension):
def before_commit(self, session):
@@ -1028,4 +1028,4 @@ class SessionExtensionTest(_fixtures.FixtureTest):
'before_commit_one',
'before_commit_two',
]
-
+
diff --git a/test/orm/test_expire.py b/test/orm/test_expire.py
index d691e7270..68b254725 100644
--- a/test/orm/test_expire.py
+++ b/test/orm/test_expire.py
@@ -92,7 +92,7 @@ class ExpireTest(_fixtures.FixtureTest):
# trick the "deleted" flag so we can re-add for the sake
# of this test
del attributes.instance_state(u).deleted
-
+
# add it back
s.add(u)
# nope, raises ObjectDeletedError
@@ -101,7 +101,7 @@ class ExpireTest(_fixtures.FixtureTest):
# do a get()/remove u from session again
assert s.query(User).get(10) is None
assert u not in s
-
+
s.rollback()
assert u in s
@@ -112,9 +112,9 @@ class ExpireTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_deferred(self):
"""test that unloaded, deferred attributes aren't included in the expiry list."""
-
+
mapper(Order, orders, properties={'description':deferred(orders.c.description)})
-
+
s = create_session()
o1 = s.query(Order).first()
assert 'description' not in o1.__dict__
@@ -122,7 +122,7 @@ class ExpireTest(_fixtures.FixtureTest):
assert o1.isopen is not None
assert 'description' not in o1.__dict__
assert o1.description
-
+
@testing.resolve_artifact_names
def test_lazyload_autoflushes(self):
mapper(User, users, properties={
@@ -150,7 +150,7 @@ class ExpireTest(_fixtures.FixtureTest):
def test_refresh_collection_exception(self):
"""test graceful failure for currently unsupported
immediate refresh of a collection"""
-
+
mapper(User, users, properties={
'addresses':relationship(Address, order_by=addresses.c.email_address)
})
@@ -160,11 +160,11 @@ class ExpireTest(_fixtures.FixtureTest):
assert_raises_message(sa_exc.InvalidRequestError,
"properties specified for refresh",
s.refresh, u, ['addresses'])
-
+
# in contrast to a regular query with no columns
assert_raises_message(sa_exc.InvalidRequestError,
"no columns with which to SELECT", s.query().all)
-
+
@testing.resolve_artifact_names
def test_refresh_cancels_expire(self):
mapper(User, users)
@@ -229,7 +229,7 @@ class ExpireTest(_fixtures.FixtureTest):
assert 'name' not in u.__dict__
sess.add(u)
assert u.name == 'jack'
-
+
@testing.resolve_artifact_names
def test_no_instance_key_no_pk(self):
# same as test_no_instance_key, but the PK columns
@@ -245,7 +245,7 @@ class ExpireTest(_fixtures.FixtureTest):
sess.add(u)
assert_raises(sa_exc.InvalidRequestError, getattr, u, 'name')
-
+
@testing.resolve_artifact_names
def test_expire_preserves_changes(self):
"""test that the expire load operation doesn't revert post-expire changes"""
@@ -350,7 +350,7 @@ class ExpireTest(_fixtures.FixtureTest):
def test_refresh_cascade_pending(self):
cascade = 'save-update, refresh-expire'
self._test_cascade_to_pending(cascade, False)
-
+
@testing.resolve_artifact_names
def _test_cascade_to_pending(self, cascade, expire_or_refresh):
mapper(User, users, properties={
@@ -361,7 +361,7 @@ class ExpireTest(_fixtures.FixtureTest):
u = s.query(User).get(8)
a = Address(id=12, email_address='foobar')
-
+
u.addresses.append(a)
if expire_or_refresh:
s.expire(u)
@@ -371,7 +371,7 @@ class ExpireTest(_fixtures.FixtureTest):
assert a not in s
else:
assert a in s
-
+
assert a not in u.addresses
s.flush()
@@ -759,9 +759,9 @@ class ExpireTest(_fixtures.FixtureTest):
"""Behavioral test to verify the current activity of loader callables."""
mapper(User, users)
-
+
sess = create_session()
-
+
# deferred attribute option, gets the LoadDeferredColumns
# callable
u1 = sess.query(User).options(defer(User.name)).first()
@@ -769,14 +769,14 @@ class ExpireTest(_fixtures.FixtureTest):
attributes.instance_state(u1).callables['name'],
strategies.LoadDeferredColumns
)
-
+
# expire the attr, it gets the InstanceState callable
sess.expire(u1, ['name'])
assert isinstance(
attributes.instance_state(u1).callables['name'],
state.InstanceState
)
-
+
# load it, callable is gone
u1.name
assert 'name' not in attributes.instance_state(u1).callables
@@ -789,28 +789,28 @@ class ExpireTest(_fixtures.FixtureTest):
attributes.instance_state(u1).callables['name'],
state.InstanceState
)
-
+
# load over it. everything normal.
sess.query(User).first()
assert 'name' not in attributes.instance_state(u1).callables
-
+
sess.expunge_all()
u1 = sess.query(User).first()
# for non present, still expires the same way
del u1.name
sess.expire(u1)
assert 'name' in attributes.instance_state(u1).callables
-
+
@testing.resolve_artifact_names
def test_state_deferred_to_col(self):
"""Behavioral test to verify the current activity of loader callables."""
-
+
mapper(User, users, properties={'name':deferred(users.c.name)})
sess = create_session()
u1 = sess.query(User).options(undefer(User.name)).first()
assert 'name' not in attributes.instance_state(u1).callables
-
+
# mass expire, the attribute was loaded,
# the attribute gets the callable
sess.expire(u1)
@@ -822,7 +822,7 @@ class ExpireTest(_fixtures.FixtureTest):
# load it, callable is gone
u1.name
assert 'name' not in attributes.instance_state(u1).callables
-
+
# mass expire, attribute was loaded but then deleted,
# the callable goes away - the state wants to flip
# it back to its "deferred" loader.
@@ -847,7 +847,7 @@ class ExpireTest(_fixtures.FixtureTest):
mapper(User, users, properties={'addresses':relationship(Address, lazy='noload')})
mapper(Address, addresses)
-
+
sess = create_session()
u1 = sess.query(User).options(lazyload(User.addresses)).first()
assert isinstance(
@@ -860,11 +860,11 @@ class ExpireTest(_fixtures.FixtureTest):
attributes.instance_state(u1).callables['addresses'],
strategies.LoadLazyAttribute
)
-
+
# load over it. callable goes away.
sess.query(User).first()
assert 'addresses' not in attributes.instance_state(u1).callables
-
+
sess.expunge_all()
u1 = sess.query(User).options(lazyload(User.addresses)).first()
sess.expire(u1, ['addresses'])
@@ -872,13 +872,13 @@ class ExpireTest(_fixtures.FixtureTest):
attributes.instance_state(u1).callables['addresses'],
strategies.LoadLazyAttribute
)
-
+
# load the attr, goes away
u1.addresses
assert 'addresses' not in attributes.instance_state(u1).callables
-
-
-
+
+
+
class PolymorphicExpireTest(_base.MappedTest):
run_inserts = 'once'
run_deletes = None
@@ -919,13 +919,13 @@ class PolymorphicExpireTest(_base.MappedTest):
{'person_id':2, 'status':'new engineer'},
{'person_id':3, 'status':'old engineer'},
)
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
mapper(Person, people, polymorphic_on=people.c.type, polymorphic_identity='person')
mapper(Engineer, engineers, inherits=Person, polymorphic_identity='engineer')
-
+
@testing.resolve_artifact_names
def test_poly_deferred(self):
@@ -965,7 +965,7 @@ class PolymorphicExpireTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_no_instance_key(self):
-
+
sess = create_session()
e1 = sess.query(Engineer).get(2)
@@ -975,7 +975,7 @@ class PolymorphicExpireTest(_base.MappedTest):
assert 'name' not in e1.__dict__
sess.add(e1)
assert e1.name == 'engineer1'
-
+
@testing.resolve_artifact_names
def test_no_instance_key(self):
# same as test_no_instance_key, but the PK columns
@@ -996,7 +996,7 @@ class ExpiredPendingTest(_fixtures.FixtureTest):
run_setup_classes = 'once'
run_setup_mappers = None
run_inserts = None
-
+
@testing.resolve_artifact_names
def test_expired_pending(self):
mapper(User, users, properties={
@@ -1008,7 +1008,7 @@ class ExpiredPendingTest(_fixtures.FixtureTest):
a1 = Address(email_address='a1')
sess.add(a1)
sess.flush()
-
+
u1 = User(name='u1')
a1.user = u1
sess.flush()
@@ -1025,17 +1025,17 @@ class ExpiredPendingTest(_fixtures.FixtureTest):
# expire u1.addresses again. this expires
# "pending" as well.
sess.expire(u1, ['addresses'])
-
+
# insert a new row
sess.execute(addresses.insert(), dict(email_address='a3', user_id=u1.id))
-
+
# only two addresses pulled from the DB, no "pending"
assert len(u1.addresses) == 2
-
+
sess.flush()
sess.expire_all()
assert len(u1.addresses) == 3
-
+
class RefreshTest(_fixtures.FixtureTest):
diff --git a/test/orm/test_extendedattr.py b/test/orm/test_extendedattr.py
index c20cad0da..0cc6a957b 100644
--- a/test/orm/test_extendedattr.py
+++ b/test/orm/test_extendedattr.py
@@ -109,18 +109,18 @@ class UserDefinedExtensionTest(_base.ORMTest):
def test_instance_dict(self):
class User(MyClass):
pass
-
+
instrumentation.register_class(User)
attributes.register_attribute(User, 'user_id', uselist = False, useobject=False)
attributes.register_attribute(User, 'user_name', uselist = False, useobject=False)
attributes.register_attribute(User, 'email_address', uselist = False, useobject=False)
-
+
u = User()
u.user_id = 7
u.user_name = 'john'
u.email_address = 'lala@123.com'
self.assert_(u.__dict__ == {'_my_state':u._my_state, '_goofy_dict':{'user_id':7, 'user_name':'john', 'email_address':'lala@123.com'}}, u.__dict__)
-
+
def test_basic(self):
for base in (object, MyBaseClass, MyClass):
class User(base):
@@ -158,7 +158,7 @@ class UserDefinedExtensionTest(_base.ORMTest):
manager.deferred_scalar_loader = loader
attributes.register_attribute(Foo, 'a', uselist=False, useobject=False)
attributes.register_attribute(Foo, 'b', uselist=False, useobject=False)
-
+
assert Foo in instrumentation.instrumentation_registry._state_finders
f = Foo()
attributes.instance_state(f).expire(attributes.instance_dict(f), set())
diff --git a/test/orm/test_froms.py b/test/orm/test_froms.py
index 6c86fa7ec..f07ddc7de 100644
--- a/test/orm/test_froms.py
+++ b/test/orm/test_froms.py
@@ -62,9 +62,9 @@ class QueryTest(_fixtures.FixtureTest):
class RawSelectTest(QueryTest, AssertsCompiledSQL):
"""compare a bunch of select() tests with the equivalent Query using straight table/columns.
-
+
Results should be the same as Query should act as a select() pass-thru for ClauseElement entities.
-
+
"""
def test_select(self):
sess = create_session()
@@ -86,7 +86,7 @@ class RawSelectTest(QueryTest, AssertsCompiledSQL):
# TODO: can we detect only one table in the "froms" and then turn off use_labels ?
s = sess.query(addresses.c.id.label('id'), addresses.c.email_address.label('email')).\
filter(addresses.c.user_id==users.c.id).correlate(users).statement.alias()
-
+
self.assert_compile(sess.query(users, s.c.email).select_from(users.join(s, s.c.id==users.c.id)).with_labels().statement,
"SELECT users.id AS users_id, users.name AS users_name, anon_1.email AS anon_1_email "
"FROM users JOIN (SELECT addresses.id AS id, addresses.email_address AS email FROM addresses "
@@ -98,7 +98,7 @@ class RawSelectTest(QueryTest, AssertsCompiledSQL):
self.assert_compile(sess.query(x).filter(x==5).statement,
"SELECT lala(users.id) AS foo FROM users WHERE lala(users.id) = :param_1", dialect=default.DefaultDialect())
- self.assert_compile(sess.query(func.sum(x).label('bar')).statement,
+ self.assert_compile(sess.query(func.sum(x).label('bar')).statement,
"SELECT sum(lala(users.id)) AS bar FROM users", dialect=default.DefaultDialect())
@@ -109,7 +109,7 @@ class FromSelfTest(QueryTest, AssertsCompiledSQL):
assert [User(id=8), User(id=9)] == create_session().query(User).order_by(User.id).slice(1,3).from_self().all()
assert [User(id=8)] == list(create_session().query(User).filter(User.id.in_([8,9])).from_self().order_by(User.id)[0:1])
-
+
def test_join(self):
assert [
(User(id=8), Address(id=2)),
@@ -118,7 +118,7 @@ class FromSelfTest(QueryTest, AssertsCompiledSQL):
(User(id=9), Address(id=5))
] == create_session().query(User).filter(User.id.in_([8,9])).from_self().\
join('addresses').add_entity(Address).order_by(User.id, Address.id).all()
-
+
def test_group_by(self):
eq_(
create_session().query(Address.user_id, func.count(Address.id).label('count')).\
@@ -132,14 +132,14 @@ class FromSelfTest(QueryTest, AssertsCompiledSQL):
group_by(Address.user_id).order_by(Address.user_id).all(),
[(7, 1), (8, 3), (9, 1)]
)
-
+
def test_no_joinedload(self):
"""test that joinedloads are pushed outwards and not rendered in subqueries."""
-
+
s = create_session()
-
+
oracle_as = not testing.against('oracle') and "AS " or ""
-
+
self.assert_compile(
s.query(User).options(joinedload(User.addresses)).from_self().statement,
"SELECT anon_1.users_id, anon_1.users_name, addresses_1.id, addresses_1.user_id, "\
@@ -148,12 +148,12 @@ class FromSelfTest(QueryTest, AssertsCompiledSQL):
'oracle_as':oracle_as
}
)
-
+
def test_aliases(self):
"""test that aliased objects are accessible externally to a from_self() call."""
-
+
s = create_session()
-
+
ualias = aliased(User)
eq_(
s.query(User, ualias).filter(User.id > ualias.id).from_self(User.name, ualias.name).
@@ -184,8 +184,8 @@ class FromSelfTest(QueryTest, AssertsCompiledSQL):
(u'jack', u'ed@wood.com'),
(u'jack', u'fred@fred.com')]
)
-
-
+
+
def test_multiple_entities(self):
sess = create_session()
@@ -199,14 +199,14 @@ class FromSelfTest(QueryTest, AssertsCompiledSQL):
eq_(
sess.query(User, Address).filter(User.id==Address.user_id).filter(Address.id.in_([2, 5])).from_self().options(joinedload('addresses')).first(),
-
+
# order_by(User.id, Address.id).first(),
(User(id=8, addresses=[Address(), Address(), Address()]), Address(id=2)),
)
def test_multiple_with_column_entities(self):
sess = create_session()
-
+
eq_(
sess.query(User.id).from_self().\
add_column(func.count().label('foo')).\
@@ -216,7 +216,7 @@ class FromSelfTest(QueryTest, AssertsCompiledSQL):
[
(7,1), (8, 1), (9, 1), (10, 1)
]
-
+
)
class AddEntityEquivalenceTest(_base.MappedTest, AssertsCompiledSQL):
@@ -252,16 +252,16 @@ class AddEntityEquivalenceTest(_base.MappedTest, AssertsCompiledSQL):
def setup_classes(cls):
class A(_fixtures.Base):
pass
-
+
class B(_fixtures.Base):
pass
-
+
class C(B):
pass
-
+
class D(A):
pass
-
+
mapper(A, a,
polymorphic_identity='a',
polymorphic_on=a.c.type,
@@ -276,7 +276,7 @@ class AddEntityEquivalenceTest(_base.MappedTest, AssertsCompiledSQL):
)
mapper(C, c, inherits=B, polymorphic_identity='c')
mapper(D, d, inherits=A, polymorphic_identity='d')
-
+
@classmethod
@testing.resolve_artifact_names
def insert_data(cls):
@@ -288,11 +288,11 @@ class AddEntityEquivalenceTest(_base.MappedTest, AssertsCompiledSQL):
A(name='a2')
])
sess.flush()
-
+
@testing.resolve_artifact_names
def test_add_entity_equivalence(self):
sess = create_session()
-
+
for q in [
sess.query( A,B).join( A.link),
sess.query( A).join( A.link).add_entity(B),
@@ -317,8 +317,8 @@ class AddEntityEquivalenceTest(_base.MappedTest, AssertsCompiledSQL):
A(bid=2, id=1, name=u'a1', type=u'a')
)]
)
-
-
+
+
class InstancesTest(QueryTest, AssertsCompiledSQL):
def test_from_alias(self):
@@ -388,7 +388,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
'users.id = addresses.user_id ORDER BY '
'users.id, addresses.id',
dialect=default.DefaultDialect())
-
+
def go():
assert self.static.user_address_result == q.all()
self.assert_sql_count(testing.db, go, 1)
@@ -484,7 +484,7 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
def test_mixed_eager_contains_with_limit(self):
sess = create_session()
-
+
q = sess.query(User)
def go():
# outerjoin to User.orders, offset 1/limit 2 so we get user
@@ -529,8 +529,8 @@ class InstancesTest(QueryTest, AssertsCompiledSQL):
, isopen=0, id=5)])])
self.assert_sql_count(testing.db, go, 1)
-
-
+
+
class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
def test_values(self):
@@ -542,7 +542,7 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
q = sess.query(User)
q2 = q.select_from(sel).values(User.name)
eq_(list(q2), [(u'jack',), (u'ed',)])
-
+
q = sess.query(User)
q2 = q.order_by(User.id).\
values(User.name, User.name + " " + cast(User.id, String(50)))
@@ -551,7 +551,7 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
[(u'jack', u'jack 7'), (u'ed', u'ed 8'),
(u'fred', u'fred 9'), (u'chuck', u'chuck 10')]
)
-
+
q2 = q.join('addresses').\
filter(User.name.like('%e%')).\
order_by(User.id, Address.id).\
@@ -559,20 +559,20 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
eq_(list(q2),
[(u'ed', u'ed@wood.com'), (u'ed', u'ed@bettyboop.com'),
(u'ed', u'ed@lala.com'), (u'fred', u'fred@fred.com')])
-
+
q2 = q.join('addresses').\
filter(User.name.like('%e%')).\
order_by(desc(Address.email_address)).\
slice(1, 3).values(User.name, Address.email_address)
eq_(list(q2), [(u'ed', u'ed@wood.com'), (u'ed', u'ed@lala.com')])
-
+
adalias = aliased(Address)
q2 = q.join(adalias, 'addresses').\
filter(User.name.like('%e%')).\
values(User.name, adalias.email_address)
eq_(list(q2), [(u'ed', u'ed@wood.com'), (u'ed', u'ed@bettyboop.com'),
(u'ed', u'ed@lala.com'), (u'fred', u'fred@fred.com')])
-
+
q2 = q.values(func.count(User.name))
assert q2.next() == (4,)
@@ -637,10 +637,10 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
def test_correlated_subquery(self):
"""test that a subquery constructed from ORM attributes doesn't leak out
those entities to the outermost query.
-
+
"""
sess = create_session()
-
+
subq = select([func.count()]).\
where(User.id==Address.user_id).\
correlate(users).\
@@ -668,17 +668,17 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
def test_tuple_labeling(self):
sess = create_session()
-
+
# test pickle + all the protocols !
for pickled in False, -1, 0, 1, 2:
for row in sess.query(User, Address).join(User.addresses).all():
if pickled is not False:
row = util.pickle.loads(util.pickle.dumps(row, pickled))
-
+
eq_(row.keys(), ['User', 'Address'])
eq_(row.User, row[0])
eq_(row.Address, row[1])
-
+
for row in sess.query(User.name, User.id.label('foobar')):
if pickled is not False:
row = util.pickle.loads(util.pickle.dumps(row, pickled))
@@ -707,22 +707,22 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
eq_(row.keys(), ['User', 'orders'])
eq_(row.User, row[0])
eq_(row.orders, row[1])
-
+
# test here that first col is not labeled, only
# one name in keys, matches correctly
for row in sess.query(User.name + 'hoho', User.name):
eq_(row.keys(), ['name'])
eq_(row[0], row.name + 'hoho')
-
+
if pickled is not False:
ret = sess.query(User, Address).join(User.addresses).all()
util.pickle.loads(util.pickle.dumps(ret, pickled))
-
+
def test_column_queries(self):
sess = create_session()
eq_(sess.query(User.name).all(), [(u'jack',), (u'ed',), (u'fred',), (u'chuck',)])
-
+
sel = users.select(User.id.in_([7, 8])).alias()
q = sess.query(User.name)
q2 = q.select_from(sel).all()
@@ -733,7 +733,7 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
(u'ed', u'ed@bettyboop.com'), (u'ed', u'ed@lala.com'),
(u'fred', u'fred@fred.com')
])
-
+
eq_(sess.query(User.name, func.count(Address.email_address)).\
outerjoin(User.addresses).group_by(User.id, User.name).\
order_by(User.id).all(),
@@ -753,7 +753,7 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
[(1, User(name='jack',id=7)), (3, User(name='ed',id=8)),
(1, User(name='fred',id=9)), (0, User(name='chuck',id=10))]
)
-
+
adalias = aliased(Address)
eq_(sess.query(User, func.count(adalias.email_address)).\
outerjoin(adalias, 'addresses').group_by(User).\
@@ -784,7 +784,7 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
(User(name=u'chuck',id=10), None)
]
)
-
+
# anon + select from aliasing
eq_(
sess.query(User).join(User.addresses, aliased=True).\
@@ -837,17 +837,17 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
def test_column_from_limited_joinedload(self):
sess = create_session()
-
+
def go():
results = sess.query(User).limit(1).\
options(joinedload('addresses')).\
add_column(User.name).all()
eq_(results, [(User(name='jack'), 'jack')])
self.assert_sql_count(testing.db, go, 1)
-
+
@testing.fails_on('postgresql+pg8000', "'type oid 705 not mapped to py type' (due to literal)")
def test_self_referential(self):
-
+
sess = create_session()
oalias = aliased(Order)
@@ -858,12 +858,12 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
sess.query(Order, oalias).from_self().filter(Order.user_id==oalias.user_id).\
filter(Order.user_id==7).filter(Order.id>oalias.id).\
order_by(Order.id, oalias.id),
-
- # same thing, but reversed.
+
+ # same thing, but reversed.
sess.query(oalias, Order).from_self().filter(oalias.user_id==Order.user_id).\
filter(oalias.user_id==7).filter(Order.id<oalias.id).\
order_by(oalias.id, Order.id),
-
+
# here we go....two layers of aliasing
sess.query(Order, oalias).filter(Order.user_id==oalias.user_id).\
filter(Order.user_id==7).filter(Order.id>oalias.id).\
@@ -877,7 +877,7 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
limit(10).options(joinedload(Order.items)),
]:
-
+
eq_(
q.all(),
[
@@ -886,11 +886,11 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
(Order(address_id=None,description=u'order 5',isopen=0,user_id=7,id=5),
Order(address_id=1,description=u'order 1',isopen=0,user_id=7,id=1)),
(Order(address_id=None,description=u'order 5',isopen=0,user_id=7,id=5),
- Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3))
+ Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3))
]
)
-
-
+
+
# ensure column expressions are taken from inside the subquery, not restated at the top
q = sess.query(Order.id, Order.description, literal_column("'q'").label('foo')).\
filter(Order.description == u'order 3').from_self()
@@ -908,8 +908,8 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
q.all(),
[(3, u'order 3', 'q')]
)
-
-
+
+
def test_multi_mappers(self):
test_session = create_session()
@@ -982,9 +982,9 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
def test_with_entities(self):
sess = create_session()
-
+
q = sess.query(User).filter(User.id==7).order_by(User.name)
-
+
self.assert_compile(
q.with_entities(User.id,Address).\
filter(Address.user_id == User.id),
@@ -996,8 +996,8 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
'addresses.user_id = users.id ORDER BY '
'users.name',
use_default_dialect=True)
-
-
+
+
def test_multi_columns(self):
sess = create_session()
@@ -1011,14 +1011,14 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
def test_add_multi_columns(self):
"""test that add_column accepts a FROM clause."""
-
+
sess = create_session()
-
+
eq_(
sess.query(User.id).add_column(users).all(),
[(7, 7, u'jack'), (8, 8, u'ed'), (9, 9, u'fred'), (10, 10, u'chuck')]
)
-
+
def test_multi_columns_2(self):
"""test aliased/nonalised joins with the usage of add_column()"""
sess = create_session()
@@ -1035,7 +1035,7 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL):
add_column(func.count(Address.id).label('count'))
eq_(q.all(), expected)
sess.expunge_all()
-
+
adalias = aliased(Address)
q = sess.query(User)
q = q.group_by(users).order_by(User.id).outerjoin(adalias, 'addresses').\
@@ -1131,7 +1131,7 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
def test_join_mapper_order_by(self):
"""test that mapper-level order_by is adapted to a selectable."""
-
+
mapper(User, users, order_by=users.c.id)
sel = users.select(users.c.id.in_([7, 8]))
@@ -1145,14 +1145,14 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
def test_differentiate_self_external(self):
"""test some different combinations of joining a table to a subquery of itself."""
-
+
mapper(User, users)
-
+
sess = create_session()
sel = sess.query(User).filter(User.id.in_([7, 8])).subquery()
ualias = aliased(User)
-
+
self.assert_compile(
sess.query(User).join(sel, User.id>sel.c.id),
"SELECT users.id AS users_id, users.name AS users_name FROM "
@@ -1160,7 +1160,7 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
"users WHERE users.id IN (:id_1, :id_2)) AS anon_1 ON users.id > anon_1.id",
use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(ualias).select_from(sel).filter(ualias.id>sel.c.id),
"SELECT users_1.id AS users_1_id, users_1.name AS users_1_name FROM "
@@ -1188,8 +1188,8 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
"IN (:id_1, :id_2)) AS anon_1 JOIN users AS users_1 ON users_1.id > anon_1.id",
use_default_dialect=True
)
-
-
+
+
# this one uses an explicit join(left, right, onclause) so works
self.assert_compile(
sess.query(ualias).select_from(join(sel, ualias, ualias.id>sel.c.id)),
@@ -1198,9 +1198,9 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
"IN (:id_1, :id_2)) AS anon_1 JOIN users AS users_1 ON users_1.id > anon_1.id",
use_default_dialect=True
)
-
-
-
+
+
+
def test_join_no_order_by(self):
mapper(User, users)
@@ -1242,7 +1242,7 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
(User(name='ed',id=8), Address(user_id=8,email_address='ed@lala.com',id=4))
]
)
-
+
def test_more_joins(self):
mapper(User, users, properties={
@@ -1321,7 +1321,7 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
])
])
self.assert_sql_count(testing.db, go, 1)
-
+
sess.expunge_all()
sel2 = orders.select(orders.c.id.in_([1,2,3]))
eq_(sess.query(Order).select_from(sel2).\
@@ -1386,7 +1386,7 @@ class CustomJoinTest(QueryTest):
closed_orders = relationship(Order, primaryjoin = and_(orders.c.isopen == 0, users.c.id==orders.c.user_id), lazy='select')
))
q = create_session().query(User)
-
+
eq_(
q.join('open_orders', 'items', aliased=True).filter(Item.id==4).\
join('closed_orders', 'items', aliased=True).filter(Item.id==3).all(),
@@ -1407,7 +1407,7 @@ class ExternalColumnsTest(QueryTest):
def test_external_columns(self):
"""test querying mappings that reference external columns or selectables."""
-
+
mapper(User, users, properties={
'concat': column_property((users.c.id * 2)),
'count': column_property(
@@ -1421,7 +1421,7 @@ class ExternalColumnsTest(QueryTest):
})
sess = create_session()
-
+
sess.query(Address).options(joinedload('user')).all()
eq_(sess.query(User).all(),
@@ -1451,7 +1451,7 @@ class ExternalColumnsTest(QueryTest):
order_by(Address.id).all(),
address_result)
self.assert_sql_count(testing.db, go, 1)
-
+
ualias = aliased(User)
eq_(
sess.query(Address, ualias).join(ualias, 'user').all(),
@@ -1559,16 +1559,16 @@ class TestOverlyEagerEquivalentCols(_base.MappedTest):
pass
class Sub2(_base.ComparableEntity):
pass
-
+
mapper(Base, base, properties={
'sub1':relationship(Sub1),
'sub2':relationship(Sub2)
})
-
+
mapper(Sub1, sub1)
mapper(Sub2, sub2)
sess = create_session()
-
+
s11 = Sub1(data='s11')
s12 = Sub1(data='s12')
s2 = Sub2(data='s2')
@@ -1577,12 +1577,12 @@ class TestOverlyEagerEquivalentCols(_base.MappedTest):
sess.add(b1)
sess.add(b2)
sess.flush()
-
+
# theres an overlapping ForeignKey here, so not much option except
# to artifically control the flush order
b2.sub2 = [s2]
sess.flush()
-
+
q = sess.query(Base).outerjoin('sub2', aliased=True)
assert sub1.c.id not in q._filter_aliases.equivalents
diff --git a/test/orm/test_generative.py b/test/orm/test_generative.py
index e3c5eee99..79da5fc7a 100644
--- a/test/orm/test_generative.py
+++ b/test/orm/test_generative.py
@@ -46,11 +46,11 @@ class GenerativeQueryTest(_base.MappedTest):
sess = create_session()
query = sess.query(Foo).order_by(Foo.id)
orig = query.all()
-
+
assert query[1] == orig[1]
assert query[-4] == orig[-4]
assert query[-1] == orig[-1]
-
+
assert list(query[10:20]) == orig[10:20]
assert list(query[10:]) == orig[10:]
assert list(query[:10]) == orig[:10]
@@ -61,7 +61,7 @@ class GenerativeQueryTest(_base.MappedTest):
assert list(query[-2:-5]) == orig[-2:-5]
assert list(query[-5:-2]) == orig[-5:-2]
assert list(query[:-2]) == orig[:-2]
-
+
assert query[10:20][5] == orig[10:20][5]
@testing.uses_deprecated('Call to deprecated function apply_max')
@@ -71,7 +71,7 @@ class GenerativeQueryTest(_base.MappedTest):
query = sess.query(Foo)
assert query.count() == 100
assert sess.query(func.min(foo.c.bar)).filter(foo.c.bar<30).one() == (0,)
-
+
assert sess.query(func.max(foo.c.bar)).filter(foo.c.bar<30).one() == (29,)
# Py3K
#assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).__next__()[0] == 29
@@ -80,7 +80,7 @@ class GenerativeQueryTest(_base.MappedTest):
assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
# end Py2K
-
+
@testing.fails_if(lambda:testing.against('mysql+mysqldb') and
testing.db.dialect.dbapi.version_info[:4] == (1, 2, 1, 'gamma'),
"unknown incompatibility")
diff --git a/test/orm/test_immediate_load.py b/test/orm/test_immediate_load.py
index 66794ad4b..eb62ef40e 100644
--- a/test/orm/test_immediate_load.py
+++ b/test/orm/test_immediate_load.py
@@ -17,12 +17,12 @@ class ImmediateTest(_fixtures.FixtureTest):
'addresses':relationship(Address)
})
sess = create_session()
-
+
l = sess.query(User).options(immediateload(User.addresses)).filter(users.c.id==7).all()
eq_(len(sess.identity_map), 2)
-
+
sess.close()
-
+
eq_(
[User(id=7, addresses=[Address(id=1, email_address='jack@bean.com')])],
l
@@ -36,11 +36,11 @@ class ImmediateTest(_fixtures.FixtureTest):
'addresses':relationship(Address, lazy='immediate')
})
sess = create_session()
-
+
l = sess.query(User).filter(users.c.id==7).all()
eq_(len(sess.identity_map), 2)
sess.close()
-
+
eq_(
[User(id=7, addresses=[Address(id=1, email_address='jack@bean.com')])],
l
diff --git a/test/orm/test_instrumentation.py b/test/orm/test_instrumentation.py
index 3d3c96c6a..18dca8e45 100644
--- a/test/orm/test_instrumentation.py
+++ b/test/orm/test_instrumentation.py
@@ -651,16 +651,16 @@ class MiscTest(_base.ORMTest):
a = A()
assert not a.bs
-
+
def test_uninstrument(self):
class A(object):pass
-
+
manager = instrumentation.register_class(A)
-
+
assert instrumentation.manager_of_class(A) is manager
instrumentation.unregister_class(A)
assert instrumentation.manager_of_class(A) is None
-
+
def test_compileonattr_rel_backref_a(self):
m = MetaData()
t1 = Table('t1', m,
diff --git a/test/orm/test_joins.py b/test/orm/test_joins.py
index 5ae16919f..af6109b9a 100644
--- a/test/orm/test_joins.py
+++ b/test/orm/test_joins.py
@@ -61,7 +61,7 @@ class QueryTest(_fixtures.FixtureTest):
class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
run_setup_mappers = 'once'
-
+
@classmethod
def define_tables(cls, metadata):
Table('companies', metadata,
@@ -80,12 +80,12 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
Column('engineer_name', String(50)),
Column('primary_language', String(50)),
)
-
+
Table('machines', metadata,
Column('machine_id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('name', String(50)),
Column('engineer_id', Integer, ForeignKey('engineers.person_id')))
-
+
Table('managers', metadata,
Column('person_id', Integer, ForeignKey('people.person_id'), primary_key=True),
Column('status', String(30)),
@@ -101,7 +101,7 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
Column('paperwork_id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('description', String(50)),
Column('person_id', Integer, ForeignKey('people.person_id')))
-
+
@classmethod
@testing.resolve_artifact_names
def setup_classes(cls):
@@ -140,11 +140,11 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
inherits=Person, polymorphic_identity='manager')
mapper(Boss, boss, inherits=Manager, polymorphic_identity='boss')
mapper(Paperwork, paperwork)
-
+
@testing.resolve_artifact_names
def test_single_prop(self):
sess = create_session()
-
+
self.assert_compile(
sess.query(Company).join(Company.employees),
"SELECT companies.company_id AS companies_company_id, companies.name AS companies_name "
@@ -176,9 +176,9 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
"WHERE companies.company_id = people.company_id AND engineers.primary_language ="
" :primary_language_1",
use_default_dialect=True
-
+
)
-
+
@testing.resolve_artifact_names
def test_single_prop_of_type(self):
sess = create_session()
@@ -200,7 +200,7 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
@testing.resolve_artifact_names
def test_prop_with_polymorphic(self):
sess = create_session()
-
+
self.assert_compile(
sess.query(Person).with_polymorphic(Manager).
join('paperwork').filter(Paperwork.description.like('%review%')),
@@ -216,7 +216,7 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
"ORDER BY people.person_id"
, use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(Person).with_polymorphic(Manager).
join('paperwork', aliased=True).
@@ -234,7 +234,7 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
@testing.resolve_artifact_names
def test_explicit_polymorphic_join(self):
sess = create_session()
-
+
self.assert_compile(
sess.query(Company).join(Engineer).filter(Engineer.engineer_name=='vlad'),
"SELECT companies.company_id AS companies_company_id, companies.name AS "
@@ -275,7 +275,7 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
def test_multiple_adaption(self):
"""test that multiple filter() adapters get chained together "
and work correctly within a multiple-entry join()."""
-
+
sess = create_session()
self.assert_compile(
@@ -295,7 +295,7 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
"anon_1.people_company_id WHERE anon_1.people_name = :name_1"
, use_default_dialect = True
)
-
+
mach_alias = machines.select()
self.assert_compile(
sess.query(Company).join(people.join(engineers), Company.employees).
@@ -324,7 +324,7 @@ class InheritedJoinTest(_base.MappedTest, AssertsCompiledSQL):
class JoinTest(QueryTest, AssertsCompiledSQL):
-
+
def test_single_name(self):
sess = create_session()
@@ -357,21 +357,21 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"ON addresses.id = orders.address_id"
, use_default_dialect=True
)
-
+
def test_multi_tuple_form(self):
"""test the 'tuple' form of join, now superceded by the two-element join() form.
-
+
Not deprecating this style as of yet.
-
+
"""
-
+
sess = create_session()
-
+
#assert_raises(
# sa.exc.SADeprecationWarning,
# sess.query(User).join, (Order, User.id==Order.user_id)
#)
-
+
self.assert_compile(
sess.query(User).join((Order, User.id==Order.user_id)),
"SELECT users.id AS users_id, users.name AS users_name "
@@ -390,7 +390,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"order_items_1.item_id",
use_default_dialect=True
)
-
+
# the old "backwards" form
self.assert_compile(
sess.query(User).join(("orders", Order)),
@@ -398,7 +398,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"FROM users JOIN orders ON users.id = orders.user_id",
use_default_dialect=True
)
-
+
def test_single_prop(self):
sess = create_session()
self.assert_compile(
@@ -424,7 +424,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"FROM orders AS orders_1 JOIN users ON users.id = orders_1.user_id"
, use_default_dialect=True
)
-
+
# another nonsensical query. (from [ticket:1537]).
# in this case, the contract of "left to right" is honored
self.assert_compile(
@@ -434,7 +434,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"orders AS orders_2 JOIN users ON users.id = orders_2.user_id"
, use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(User).join(User.orders, Order.items),
"SELECT users.id AS users_id, users.name AS users_name FROM users "
@@ -442,7 +442,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"ON orders.id = order_items_1.order_id JOIN items ON items.id = order_items_1.item_id"
, use_default_dialect=True
)
-
+
ualias = aliased(User)
self.assert_compile(
sess.query(ualias).join(ualias.orders),
@@ -450,7 +450,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"FROM users AS users_1 JOIN orders ON users_1.id = orders.user_id"
, use_default_dialect=True
)
-
+
# this query is somewhat nonsensical. the old system didn't render a correct
# query for this. In this case its the most faithful to what was asked -
# there's no linkage between User.orders and "oalias", so two FROM elements
@@ -484,7 +484,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"WHERE users.name = :name_1) AS anon_1 JOIN orders ON anon_1.users_id = orders.user_id"
, use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(User).join(User.addresses, aliased=True).filter(Address.email_address=='foo'),
"SELECT users.id AS users_id, users.name AS users_name "
@@ -502,7 +502,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"WHERE items_1.id = :id_1"
, use_default_dialect=True
)
-
+
# test #1 for [ticket:1706]
ualias = aliased(User)
self.assert_compile(
@@ -515,7 +515,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"= addresses.user_id"
, use_default_dialect=True
)
-
+
# test #2 for [ticket:1706]
ualias2 = aliased(User)
self.assert_compile(
@@ -528,7 +528,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"ON users_2.id = addresses.user_id JOIN orders ON users_1.id = orders.user_id"
, use_default_dialect=True
)
-
+
def test_overlapping_paths(self):
for aliased in (True,False):
# load a user who has an order that contains item id 3 and address id 1 (order 3, owned by jack)
@@ -540,10 +540,10 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
result = create_session().query(User).outerjoin('orders', 'items').\
filter_by(id=3).outerjoin('orders','address').filter_by(id=1).all()
assert [User(id=7, name='jack')] == result
-
+
def test_from_joinpoint(self):
sess = create_session()
-
+
for oalias,ialias in [(True, True), (False, False), (True, False), (False, True)]:
eq_(
sess.query(User).join('orders', aliased=oalias).\
@@ -563,7 +563,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
filter(Item.description=='item 4').all(),
[]
)
-
+
orderalias = aliased(Order)
itemalias = aliased(Item)
eq_(
@@ -579,11 +579,11 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
filter(itemalias.description=='item 4').all(),
[]
)
-
+
def test_join_nonmapped_column(self):
"""test that the search for a 'left' doesn't trip on non-mapped cols"""
sess = create_session()
-
+
# intentionally join() with a non-existent "left" side
self.assert_compile(
sess.query(User.id, literal_column('foo')).join(Order.user),
@@ -591,13 +591,13 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"orders JOIN users ON users.id = orders.user_id"
, use_default_dialect=True
)
-
-
-
+
+
+
def test_backwards_join(self):
# a more controversial feature. join from
# User->Address, but the onclause is Address.user.
-
+
sess = create_session()
eq_(
@@ -612,7 +612,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
sess.query(User, Address).join(Address.user).filter(Address.email_address=='ed@wood.com').all(),
[(User(id=8,name=u'ed'), Address(email_address='ed@wood.com'))]
)
-
+
# this was the controversial part. now, raise an error if the feature is abused.
# before the error raise was added, this would silently work.....
assert_raises(
@@ -626,10 +626,10 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
sa_exc.InvalidRequestError,
sess.query(User).join, adalias, Address.user,
)
-
+
def test_multiple_with_aliases(self):
sess = create_session()
-
+
ualias = aliased(User)
oalias1 = aliased(Order)
oalias2 = aliased(Order)
@@ -645,7 +645,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
def test_select_from_orm_joins(self):
sess = create_session()
-
+
ualias = aliased(User)
oalias1 = aliased(Order)
oalias2 = aliased(Order)
@@ -702,18 +702,18 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"users_1_name FROM users AS users_1 JOIN orders AS orders_1 ON users_1.id = orders_1.user_id, "
"users JOIN orders AS orders_2 ON users.id = orders_2.user_id "
"WHERE orders_1.user_id = :user_id_1 OR orders_2.user_id = :user_id_2",
-
+
use_default_dialect=True
)
-
-
+
+
def test_overlapping_backwards_joins(self):
sess = create_session()
oalias1 = aliased(Order)
oalias2 = aliased(Order)
-
- # this is invalid SQL - joins from orders_1/orders_2 to User twice.
+
+ # this is invalid SQL - joins from orders_1/orders_2 to User twice.
# but that is what was asked for so they get it !
self.assert_compile(
sess.query(User).join(oalias1.user).join(oalias2.user),
@@ -724,9 +724,9 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
def test_replace_multiple_from_clause(self):
"""test adding joins onto multiple FROM clauses"""
-
+
sess = create_session()
-
+
self.assert_compile(
sess.query(Address, User).join(Address.dingaling).join(User.orders, Order.items),
"SELECT addresses.id AS addresses_id, addresses.user_id AS addresses_user_id, "
@@ -736,7 +736,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"ON orders.id = order_items_1.order_id JOIN items ON items.id = order_items_1.item_id",
use_default_dialect = True
)
-
+
def test_multiple_adaption(self):
sess = create_session()
@@ -747,7 +747,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"JOIN items AS items_1 ON items_1.id = order_items_1.item_id WHERE orders_1.id = :id_1 AND items_1.id = :id_2",
use_default_dialect=True
)
-
+
def test_onclause_conditional_adaption(self):
sess = create_session()
@@ -764,8 +764,8 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"ON orders_1.id = order_items.order_id AND order_items.item_id = items_1.id",
use_default_dialect=True
)
-
-
+
+
oalias = orders.select()
self.assert_compile(
sess.query(User).join(oalias, User.orders).
@@ -779,21 +779,21 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"ON anon_1.id = order_items.order_id AND order_items.item_id = items.id",
use_default_dialect=True
)
-
+
# query.join(<stuff>, aliased=True).join(target, sql_expression)
# or: query.join(path_to_some_joined_table_mapper).join(target, sql_expression)
-
+
def test_pure_expression_error(self):
sess = create_session()
-
+
assert_raises_message(sa.exc.InvalidRequestError, "Could not find a FROM clause to join from", sess.query(users).join, addresses)
-
-
+
+
def test_orderby_arg_bug(self):
sess = create_session()
# no arg error
result = sess.query(User).join('orders', aliased=True).order_by(Order.id).reset_joinpoint().order_by(users.c.id).all()
-
+
def test_no_onclause(self):
sess = create_session()
@@ -812,7 +812,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
.filter(Item.description == 'item 4').all(),
[User(name='jack')]
)
-
+
def test_clause_onclause(self):
sess = create_session()
@@ -860,8 +860,8 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
all(),
[User(name='fred')]
)
-
-
+
+
def test_aliased_classes(self):
sess = create_session()
@@ -903,9 +903,9 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
def test_expression_onclauses(self):
sess = create_session()
-
+
subq = sess.query(User).subquery()
-
+
self.assert_compile(
sess.query(User).join(subq, User.name==subq.c.name),
"SELECT users.id AS users_id, users.name AS users_name "
@@ -913,8 +913,8 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"AS name FROM users) AS anon_1 ON users.name = anon_1.name",
use_default_dialect=True
)
-
-
+
+
subq = sess.query(Order).subquery()
self.assert_compile(
sess.query(User).join(subq, User.id==subq.c.user_id),
@@ -925,15 +925,15 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"anon_1 ON users.id = anon_1.user_id",
use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(User).join(Order, User.id==Order.user_id),
"SELECT users.id AS users_id, users.name AS users_name "
"FROM users JOIN orders ON users.id = orders.user_id",
use_default_dialect=True
)
-
-
+
+
def test_implicit_joins_from_aliases(self):
sess = create_session()
OrderAlias = aliased(Order)
@@ -947,7 +947,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3)
]
)
-
+
eq_(
sess.query(User, OrderAlias, Item.description).
join(OrderAlias, 'orders').
@@ -959,11 +959,11 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
(User(name=u'jack',id=7), Order(address_id=1,description=u'order 3',isopen=1,user_id=7,id=3), u'item 3'),
(User(name=u'fred',id=9), Order(address_id=4,description=u'order 2',isopen=0,user_id=9,id=2), u'item 3')
]
- )
-
+ )
+
def test_aliased_classes_m2m(self):
sess = create_session()
-
+
(order1, order2, order3, order4, order5) = sess.query(Order).all()
(item1, item2, item3, item4, item5) = sess.query(Item).all()
expected = [
@@ -980,7 +980,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
(order4, item5),
(order5, item5),
]
-
+
q = sess.query(Order)
q = q.add_entity(Item).select_from(join(Order, Item, 'items')).order_by(Order.id, Item.id)
l = q.all()
@@ -996,7 +996,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
(order3, item3),
]
)
-
+
def test_joins_from_adapted_entities(self):
# test for #1853
@@ -1034,7 +1034,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
'(SELECT users.id AS id FROM users) AS '
'anon_2 ON anon_2.id = anon_1.users_id',
use_default_dialect=True)
-
+
def test_reset_joinpoint(self):
for aliased in (True, False):
# load a user who has an order that contains item id 3 and address id 1 (order 3, owned by jack)
@@ -1043,7 +1043,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
result = create_session().query(User).outerjoin('orders', 'items', aliased=aliased).filter_by(id=3).reset_joinpoint().outerjoin('orders','address', aliased=aliased).filter_by(id=1).all()
assert [User(id=7, name='jack')] == result
-
+
def test_overlap_with_aliases(self):
oalias = orders.alias('oalias')
@@ -1083,7 +1083,7 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
# the left half of the join condition of the any() is aliased.
q = sess.query(User).join('orders', aliased=True).filter(Order.items.any(Item.description=='item 4'))
assert [User(id=7)] == q.all()
-
+
# test that aliasing gets reset when join() is called
q = sess.query(User).join('orders', aliased=True).filter(Order.description=="order 3").join('orders', aliased=True).filter(Order.description=="order 5")
assert q.count() == 1
@@ -1106,35 +1106,35 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
)
def test_plain_table(self):
-
+
sess = create_session()
-
+
eq_(
sess.query(User.name).join(addresses, User.id==addresses.c.user_id).order_by(User.id).all(),
[(u'jack',), (u'ed',), (u'ed',), (u'ed',), (u'fred',)]
)
-
+
def test_no_joinpoint_expr(self):
sess = create_session()
-
+
# these are consistent regardless of
# select_from() being present.
-
+
assert_raises_message(
sa_exc.InvalidRequestError,
"Could not find a FROM",
sess.query(users.c.id).join, User
)
-
+
assert_raises_message(
sa_exc.InvalidRequestError,
"Could not find a FROM",
sess.query(users.c.id).select_from(users).join, User
)
-
+
def test_select_from(self):
"""Test that the left edge of the join can be set reliably with select_from()."""
-
+
sess = create_session()
self.assert_compile(
sess.query(Item.id).select_from(User).join(User.orders).join(Order.items),
@@ -1152,16 +1152,16 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
"SELECT items.id AS items_id FROM users JOIN items ON users.id = items.id",
use_default_dialect=True
)
-
-
-
-
+
+
+
+
def test_from_self_resets_joinpaths(self):
"""test a join from from_self() doesn't confuse joins inside the subquery
with the outside.
"""
sess = create_session()
-
+
self.assert_compile(
sess.query(Item).join(Item.keywords).from_self(Keyword).join(Item.keywords),
"SELECT keywords.id AS keywords_id, keywords.name AS keywords_name FROM "
@@ -1222,30 +1222,30 @@ class MultiplePathTest(_base.MappedTest, AssertsCompiledSQL):
class SelfRefMixedTest(_base.MappedTest, AssertsCompiledSQL):
run_setup_mappers = 'once'
__dialect__ = default.DefaultDialect()
-
+
@classmethod
def define_tables(cls, metadata):
nodes = Table('nodes', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('parent_id', Integer, ForeignKey('nodes.id'))
)
-
+
sub_table = Table('sub_table', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('node_id', Integer, ForeignKey('nodes.id')),
)
-
+
assoc_table = Table('assoc_table', metadata,
Column('left_id', Integer, ForeignKey('nodes.id')),
Column('right_id', Integer, ForeignKey('nodes.id'))
)
-
+
@classmethod
@testing.resolve_artifact_names
def setup_classes(cls):
class Node(Base):
pass
-
+
class Sub(Base):
pass
@@ -1272,7 +1272,7 @@ class SelfRefMixedTest(_base.MappedTest, AssertsCompiledSQL):
"FROM nodes JOIN nodes AS nodes_1 ON nodes.id = nodes_1.parent_id "
"JOIN sub_table ON nodes_1.id = sub_table.node_id"
)
-
+
self.assert_compile(
sess.query(Node).join(n1, Node.children).join(Sub, Node.subs),
"SELECT nodes.id AS nodes_id, nodes.parent_id AS nodes_parent_id "
@@ -1292,7 +1292,7 @@ class SelfRefMixedTest(_base.MappedTest, AssertsCompiledSQL):
"assoc_table_1.left_id JOIN nodes AS nodes_1 ON nodes_1.id = "
"assoc_table_1.right_id JOIN sub_table ON nodes_1.id = sub_table.node_id",
)
-
+
self.assert_compile(
sess.query(Node).join(n1, Node.assoc).join(Sub, Node.subs),
"SELECT nodes.id AS nodes_id, nodes.parent_id AS nodes_parent_id "
@@ -1300,8 +1300,8 @@ class SelfRefMixedTest(_base.MappedTest, AssertsCompiledSQL):
"assoc_table_1.left_id JOIN nodes AS nodes_1 ON nodes_1.id = "
"assoc_table_1.right_id JOIN sub_table ON nodes.id = sub_table.node_id",
)
-
-
+
+
class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
run_setup_mappers = 'once'
run_inserts = 'once'
@@ -1314,17 +1314,17 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('parent_id', Integer, ForeignKey('nodes.id')),
Column('data', String(30)))
-
+
@classmethod
def insert_data(cls):
# TODO: somehow using setup_classes()
# here normally is screwing up the other tests.
-
+
global Node, Sub
class Node(Base):
def append(self, node):
self.children.append(node)
-
+
mapper(Node, nodes, properties={
'children':relationship(Node, lazy='select', join_depth=3,
backref=backref('parent', remote_side=[nodes.c.id])
@@ -1342,7 +1342,7 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
sess.add(n1)
sess.flush()
sess.close()
-
+
@testing.resolve_artifact_names
def test_join(self):
sess = create_session()
@@ -1353,24 +1353,24 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
ret = sess.query(Node.data).join(Node.children, aliased=True).filter_by(data='n122').all()
assert ret == [('n12',)]
-
+
node = sess.query(Node).join('children', 'children', aliased=True).filter_by(data='n122').first()
assert node.data=='n1'
node = sess.query(Node).filter_by(data='n122').join('parent', aliased=True).filter_by(data='n12').\
join('parent', aliased=True, from_joinpoint=True).filter_by(data='n1').first()
assert node.data == 'n122'
-
+
@testing.resolve_artifact_names
def test_string_or_prop_aliased(self):
"""test that join('foo') behaves the same as join(Cls.foo) in a self
referential scenario.
-
+
"""
-
+
sess = create_session()
nalias = aliased(Node, sess.query(Node).filter_by(data='n1').subquery())
-
+
q1 = sess.query(nalias).join(nalias.children, aliased=True).\
join(Node.children, from_joinpoint=True)
@@ -1388,7 +1388,7 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
"nodes_1.parent_id JOIN nodes ON nodes_1.id = nodes.parent_id",
use_default_dialect=True
)
-
+
q1 = sess.query(Node).join(nalias.children, aliased=True).\
join(Node.children, aliased=True, from_joinpoint=True).\
join(Node.children, from_joinpoint=True)
@@ -1396,7 +1396,7 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
q2 = sess.query(Node).join(nalias.children, aliased=True).\
join("children", aliased=True, from_joinpoint=True).\
join("children", from_joinpoint=True)
-
+
for q in (q1, q2):
self.assert_compile(
q,
@@ -1409,16 +1409,16 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
"JOIN nodes ON nodes_2.id = nodes.parent_id",
use_default_dialect=True
)
-
+
@testing.resolve_artifact_names
def test_from_self_inside_excludes_outside(self):
"""test the propagation of aliased() from inside to outside
on a from_self()..
"""
sess = create_session()
-
+
n1 = aliased(Node)
-
+
# n1 is not inside the from_self(), so all cols must be maintained
# on the outside
self.assert_compile(
@@ -1438,7 +1438,7 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
join(grandparent, parent.parent).\
filter(Node.data=='n122').filter(parent.data=='n12').\
filter(grandparent.data=='n1').from_self().limit(1)
-
+
# parent, grandparent *are* inside the from_self(), so they
# should get aliased to the outside.
self.assert_compile(
@@ -1465,14 +1465,14 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
{'param_1':1},
use_default_dialect=True
)
-
+
@testing.resolve_artifact_names
def test_explicit_join(self):
sess = create_session()
-
+
n1 = aliased(Node)
n2 = aliased(Node)
-
+
self.assert_compile(
join(Node, n1, 'children').join(n2, 'children'),
"nodes JOIN nodes AS nodes_1 ON nodes.id = nodes_1.parent_id JOIN nodes AS nodes_2 ON nodes_1.id = nodes_2.parent_id",
@@ -1500,7 +1500,7 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
"JOIN nodes AS nodes_2 ON nodes_1.id = nodes_2.parent_id",
use_default_dialect=True
)
-
+
self.assert_compile(
sess.query(Node).join(n1, Node.children).join(n2, Node.children),
"SELECT nodes.id AS nodes_id, nodes.parent_id AS nodes_parent_id, nodes.data AS "
@@ -1508,14 +1508,14 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
"JOIN nodes AS nodes_2 ON nodes.id = nodes_2.parent_id",
use_default_dialect=True
)
-
+
node = sess.query(Node).select_from(join(Node, n1, 'children')).filter(n1.data=='n122').first()
assert node.data=='n12'
-
+
node = sess.query(Node).select_from(join(Node, n1, 'children').join(n2, 'children')).\
filter(n2.data=='n122').first()
assert node.data=='n1'
-
+
# mix explicit and named onclauses
node = sess.query(Node).select_from(join(Node, n1, Node.id==n1.parent_id).join(n2, 'children')).\
filter(n2.data=='n122').first()
@@ -1529,11 +1529,11 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
list(sess.query(Node).select_from(join(Node, n1, 'parent').join(n2, 'parent')).\
filter(and_(Node.data=='n122', n1.data=='n12', n2.data=='n1')).values(Node.data, n1.data, n2.data)),
[('n122', 'n12', 'n1')])
-
+
@testing.resolve_artifact_names
def test_join_to_nonaliased(self):
sess = create_session()
-
+
n1 = aliased(Node)
# using 'n1.parent' implicitly joins to unaliased Node
@@ -1541,18 +1541,18 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
sess.query(n1).join(n1.parent).filter(Node.data=='n1').all(),
[Node(parent_id=1,data=u'n11',id=2), Node(parent_id=1,data=u'n12',id=3), Node(parent_id=1,data=u'n13',id=4)]
)
-
+
# explicit (new syntax)
eq_(
sess.query(n1).join(Node, n1.parent).filter(Node.data=='n1').all(),
[Node(parent_id=1,data=u'n11',id=2), Node(parent_id=1,data=u'n12',id=3), Node(parent_id=1,data=u'n13',id=4)]
)
-
-
+
+
@testing.resolve_artifact_names
def test_multiple_explicit_entities(self):
sess = create_session()
-
+
parent = aliased(Node)
grandparent = aliased(Node)
eq_(
@@ -1602,8 +1602,8 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
options(joinedload(Node.children)).first(),
(Node(data='n122'), Node(data='n12'), Node(data='n1'))
)
-
-
+
+
@testing.resolve_artifact_names
def test_any(self):
sess = create_session()
@@ -1615,7 +1615,7 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
@testing.resolve_artifact_names
def test_has(self):
sess = create_session()
-
+
eq_(sess.query(Node).filter(Node.parent.has(Node.data=='n12')).order_by(Node.id).all(),
[Node(data='n121'),Node(data='n122'),Node(data='n123')])
eq_(sess.query(Node).filter(Node.parent.has(Node.data=='n122')).all(), [])
@@ -1624,7 +1624,7 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
@testing.resolve_artifact_names
def test_contains(self):
sess = create_session()
-
+
n122 = sess.query(Node).filter(Node.data=='n122').one()
eq_(sess.query(Node).filter(Node.children.contains(n122)).all(), [Node(data='n12')])
@@ -1634,10 +1634,10 @@ class SelfReferentialTest(_base.MappedTest, AssertsCompiledSQL):
@testing.resolve_artifact_names
def test_eq_ne(self):
sess = create_session()
-
+
n12 = sess.query(Node).filter(Node.data=='n12').one()
eq_(sess.query(Node).filter(Node.parent==n12).all(), [Node(data='n121'),Node(data='n122'),Node(data='n123')])
-
+
eq_(sess.query(Node).filter(Node.parent != n12).all(), [Node(data='n1'), Node(data='n11'), Node(data='n12'), Node(data='n13')])
class SelfReferentialM2MTest(_base.MappedTest):
@@ -1651,7 +1651,7 @@ class SelfReferentialM2MTest(_base.MappedTest):
nodes = Table('nodes', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('data', String(30)))
-
+
node_to_nodes =Table('node_to_nodes', metadata,
Column('left_node_id', Integer, ForeignKey('nodes.id'),primary_key=True),
Column('right_node_id', Integer, ForeignKey('nodes.id'),primary_key=True),
@@ -1660,7 +1660,7 @@ class SelfReferentialM2MTest(_base.MappedTest):
@classmethod
def insert_data(cls):
global Node
-
+
class Node(Base):
pass
@@ -1678,7 +1678,7 @@ class SelfReferentialM2MTest(_base.MappedTest):
n5 = Node(data='n5')
n6 = Node(data='n6')
n7 = Node(data='n7')
-
+
n1.children = [n2, n3, n4]
n2.children = [n3, n6, n7]
n3.children = [n5, n4]
@@ -1703,7 +1703,7 @@ class SelfReferentialM2MTest(_base.MappedTest):
def test_explicit_join(self):
sess = create_session()
-
+
n1 = aliased(Node)
eq_(
sess.query(Node).select_from(join(Node, n1, 'children')).filter(n1.data.in_(['n3', 'n7'])).order_by(Node.id).all(),
diff --git a/test/orm/test_lazy_relations.py b/test/orm/test_lazy_relations.py
index 1bf7eecaf..3208d060e 100644
--- a/test/orm/test_lazy_relations.py
+++ b/test/orm/test_lazy_relations.py
@@ -191,7 +191,7 @@ class LazyTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_many_to_one_binds(self):
mapper(Address, addresses, primary_key=[addresses.c.user_id, addresses.c.email_address])
-
+
mapper(User, users, properties = dict(
address = relationship(Address, uselist=False,
primaryjoin=sa.and_(users.c.id==addresses.c.user_id, addresses.c.email_address=='ed@bettyboop.com')
@@ -207,7 +207,7 @@ class LazyTest(_fixtures.FixtureTest):
],
list(q)
)
-
+
@testing.resolve_artifact_names
def test_double(self):
@@ -217,9 +217,9 @@ class LazyTest(_fixtures.FixtureTest):
closedorders = sa.alias(orders, 'closedorders')
mapper(Address, addresses)
-
+
mapper(Order, orders)
-
+
open_mapper = mapper(Order, openorders, non_primary=True)
closed_mapper = mapper(Order, closedorders, non_primary=True)
mapper(User, users, properties = dict(
@@ -306,10 +306,10 @@ class LazyTest(_fixtures.FixtureTest):
class SmallintDecorator(TypeDecorator):
impl = SmallInteger
-
+
class SomeDBInteger(sa.Integer):
pass
-
+
for tt in [
Integer,
SmallInteger,
diff --git a/test/orm/test_legacy_mutable.py b/test/orm/test_legacy_mutable.py
index f3d3d583d..dee3f193c 100644
--- a/test/orm/test_legacy_mutable.py
+++ b/test/orm/test_legacy_mutable.py
@@ -40,7 +40,7 @@ class MutableTypesTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_modified_status(self):
f1 = Foo(data = pickleable.Bar(4,5))
-
+
session = Session()
session.add(f1)
session.commit()
@@ -52,27 +52,27 @@ class MutableTypesTest(_base.MappedTest):
f2.data.y = 19
assert f2 in session.dirty
assert 'data' not in sa.orm.attributes.instance_state(f2).unmodified
-
+
@testing.resolve_artifact_names
def test_mutations_persisted(self):
f1 = Foo(data = pickleable.Bar(4,5))
-
+
session = Session()
session.add(f1)
session.commit()
f1.data
session.close()
-
+
f2 = session.query(Foo).first()
f2.data.y = 19
session.commit()
f2.data
session.close()
-
+
f3 = session.query(Foo).first()
ne_(f3.data,f1.data)
eq_(f3.data, pickleable.Bar(4, 19))
-
+
@testing.resolve_artifact_names
def test_no_unnecessary_update(self):
f1 = Foo(data = pickleable.Bar(4,5), val = u'hi')
@@ -82,7 +82,7 @@ class MutableTypesTest(_base.MappedTest):
session.commit()
self.sql_count_(0, session.commit)
-
+
f1.val = u'someothervalue'
self.assert_sql(testing.db, session.commit, [
("UPDATE mutable_t SET val=:val "
@@ -95,7 +95,7 @@ class MutableTypesTest(_base.MappedTest):
("UPDATE mutable_t SET data=:data, val=:val "
"WHERE mutable_t.id = :mutable_t_id",
{'mutable_t_id': f1.id, 'val': u'hi', 'data':f1.data})])
-
+
@testing.resolve_artifact_names
def test_mutated_state_resurrected(self):
f1 = Foo(data = pickleable.Bar(4,5), val = u'hi')
@@ -119,7 +119,7 @@ class MutableTypesTest(_base.MappedTest):
"""test that a non-mutable attribute event subsequent to
a mutable event prevents the object from falling into
resurrected state.
-
+
"""
f1 = Foo(data = pickleable.Bar(4, 5), val=u'some val')
session = Session()
@@ -130,7 +130,7 @@ class MutableTypesTest(_base.MappedTest):
f1.val=u'some new val'
assert sa.orm.attributes.instance_state(f1)._strong_obj is not None
-
+
del f1
session.commit()
eq_(
@@ -141,11 +141,11 @@ class MutableTypesTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_non_mutated_state_not_resurrected(self):
f1 = Foo(data = pickleable.Bar(4,5))
-
+
session = Session()
session.add(f1)
session.commit()
-
+
session = Session()
f1 = session.query(Foo).first()
del f1
@@ -159,7 +159,7 @@ class MutableTypesTest(_base.MappedTest):
def test_scalar_no_net_change_no_update(self):
"""Test that a no-net-change on a scalar attribute event
doesn't cause an UPDATE for a mutable state.
-
+
"""
f1 = Foo(val=u'hi')
@@ -177,45 +177,45 @@ class MutableTypesTest(_base.MappedTest):
def test_expire_attribute_set(self):
"""test no SELECT emitted when assigning to an expired
mutable attribute.
-
+
"""
-
+
f1 = Foo(data = pickleable.Bar(4, 5), val=u'some val')
session = Session()
session.add(f1)
session.commit()
-
+
assert 'data' not in f1.__dict__
def go():
f1.data = pickleable.Bar(10, 15)
self.sql_count_(0, go)
session.commit()
-
+
eq_(f1.data.x, 10)
@testing.resolve_artifact_names
def test_expire_mutate(self):
"""test mutations are detected on an expired mutable
attribute."""
-
+
f1 = Foo(data = pickleable.Bar(4, 5), val=u'some val')
session = Session()
session.add(f1)
session.commit()
-
+
assert 'data' not in f1.__dict__
def go():
f1.data.x = 10
self.sql_count_(1, go)
session.commit()
-
+
eq_(f1.data.x, 10)
-
+
@testing.resolve_artifact_names
def test_deferred_attribute_set(self):
"""test no SELECT emitted when assigning to a deferred
mutable attribute.
-
+
"""
sa.orm.clear_mappers()
mapper(Foo, mutable_t, properties={
@@ -226,22 +226,22 @@ class MutableTypesTest(_base.MappedTest):
session = Session()
session.add(f1)
session.commit()
-
+
session.close()
-
+
f1 = session.query(Foo).first()
def go():
f1.data = pickleable.Bar(10, 15)
self.sql_count_(0, go)
session.commit()
-
+
eq_(f1.data.x, 10)
@testing.resolve_artifact_names
def test_deferred_mutate(self):
"""test mutations are detected on a deferred mutable
attribute."""
-
+
sa.orm.clear_mappers()
mapper(Foo, mutable_t, properties={
'data':sa.orm.deferred(mutable_t.c.data)
@@ -251,15 +251,15 @@ class MutableTypesTest(_base.MappedTest):
session = Session()
session.add(f1)
session.commit()
-
+
session.close()
-
+
f1 = session.query(Foo).first()
def go():
f1.data.x = 10
self.sql_count_(1, go)
session.commit()
-
+
def go():
eq_(f1.data.x, 10)
self.sql_count_(1, go)
diff --git a/test/orm/test_load_on_fks.py b/test/orm/test_load_on_fks.py
index 3e7ddb8c2..f8a080f3f 100644
--- a/test/orm/test_load_on_fks.py
+++ b/test/orm/test_load_on_fks.py
@@ -15,19 +15,19 @@ class FlushOnPendingTest(AssertsExecutionResults, TestBase):
def setUp(self):
global Parent, Child, Base
Base= declarative_base()
-
+
class Parent(Base):
__tablename__ = 'parent'
-
+
id= Column(Integer, primary_key=True, test_needs_autoincrement=True)
name = Column(String(50), nullable=False)
children = relationship("Child", load_on_pending=True)
-
+
class Child(Base):
__tablename__ = 'child'
id= Column(Integer, primary_key=True, test_needs_autoincrement=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
-
+
Base.metadata.create_all(engine)
def tearDown(self):
@@ -35,38 +35,38 @@ class FlushOnPendingTest(AssertsExecutionResults, TestBase):
def test_annoying_autoflush_one(self):
sess = Session(engine)
-
+
p1 = Parent()
sess.add(p1)
p1.children = []
def test_annoying_autoflush_two(self):
sess = Session(engine)
-
+
p1 = Parent()
sess.add(p1)
assert p1.children == []
def test_dont_load_if_no_keys(self):
sess = Session(engine)
-
+
p1 = Parent()
sess.add(p1)
-
+
def go():
assert p1.children == []
self.assert_sql_count(testing.db, go, 0)
class LoadOnFKsTest(AssertsExecutionResults, TestBase):
-
+
def setUp(self):
global Parent, Child, Base
Base= declarative_base()
-
+
class Parent(Base):
__tablename__ = 'parent'
__table_args__ = {'mysql_engine':'InnoDB'}
-
+
id= Column(Integer, primary_key=True, test_needs_autoincrement=True)
class Child(Base):
@@ -75,9 +75,9 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
id= Column(Integer, primary_key=True, test_needs_autoincrement=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
-
+
parent = relationship(Parent, backref=backref("children"))
-
+
Base.metadata.create_all(engine)
global sess, p1, p2, c1, c2
@@ -91,7 +91,7 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
assert c1 in sess
sess.commit()
-
+
def tearDown(self):
sess.rollback()
Base.metadata.drop_all(engine)
@@ -103,7 +103,7 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
sess.add(c3)
c3.parent_id = p1.id
c3.parent = p1
-
+
# a side effect of load-on-pending with no autoflush.
# a change to the backref event handler to check
# collection membership before assuming "old == new so return"
@@ -117,27 +117,27 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
sess.add(c3)
c3.parent_id = p1.id
c3.parent = p1
-
+
assert c3 in p1.children
def test_no_load_on_pending_allows_backref_event(self):
# users who stick with the program and don't use
# 'load_on_pending' get expected behavior
-
+
sess.autoflush = False
c3 = Child()
sess.add(c3)
c3.parent_id = p1.id
c3.parent = p1
-
+
assert c3 in p1.children
-
+
def test_autoflush_on_pending(self):
c3 = Child()
sess.add(c3)
c3.parent_id = p1.id
-
+
# pendings don't autoflush
assert c3.parent is None
@@ -146,10 +146,10 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
c3 = Child()
sess.add(c3)
c3.parent_id = p1.id
-
+
# ...unless the flag is on
assert c3.parent is p1
-
+
def test_load_on_pending_with_set(self):
Child.parent.property.load_on_pending = True
@@ -157,13 +157,13 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
c3 = Child()
sess.add(c3)
-
+
c3.parent_id = p1.id
def go():
c3.parent = p1
self.assert_sql_count(testing.db, go, 0)
-
+
def test_backref_doesnt_double(self):
Child.parent.property.load_on_pending = True
sess.autoflush = False
@@ -175,12 +175,12 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
c3.parent = p1
c3.parent = p1
assert len(p1.children)== 2
-
+
def test_m2o_lazy_loader_on_persistent(self):
"""Compare the behaviors from the lazyloader using
the "committed" state in all cases, vs. the lazyloader
using the "current" state in all cases except during flush.
-
+
"""
for loadfk in (True, False):
for loadrel in (True, False):
@@ -188,23 +188,23 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
for manualflush in (True, False):
for fake_autoexpire in (True, False):
sess.autoflush = autoflush
-
+
if loadfk:
c1.parent_id
if loadrel:
c1.parent
c1.parent_id = p2.id
-
+
if manualflush:
sess.flush()
-
+
# fake_autoexpire refers to the eventual
# auto-expire of 'parent' when c1.parent_id
# is altered.
if fake_autoexpire:
sess.expire(c1, ['parent'])
-
+
# old 0.6 behavior
#if manualflush and (not loadrel or fake_autoexpire):
# # a flush occurs, we get p2
@@ -219,15 +219,15 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
# # if things were loaded, autoflush doesn't even
# # happen.
# assert c1.parent is p1
-
+
# new behavior
if loadrel and not fake_autoexpire:
assert c1.parent is p1
else:
assert c1.parent is p2
-
+
sess.rollback()
-
+
def test_m2o_lazy_loader_on_pending(self):
for loadonpending in (False, True):
for autoflush in (False, True):
@@ -237,15 +237,15 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
c2 = Child()
sess.add(c2)
c2.parent_id = p2.id
-
+
if manualflush:
sess.flush()
-
+
if loadonpending or manualflush:
assert c2.parent is p2
else:
assert c2.parent is None
-
+
sess.rollback()
def test_m2o_lazy_loader_on_transient(self):
@@ -256,18 +256,18 @@ class LoadOnFKsTest(AssertsExecutionResults, TestBase):
Child.parent.property.load_on_pending = loadonpending
sess.autoflush = autoflush
c2 = Child()
-
+
if attach:
sess._attach(instance_state(c2))
c2.parent_id = p2.id
-
+
if manualflush:
sess.flush()
-
+
if loadonpending and attach:
assert c2.parent is p2
else:
assert c2.parent is None
-
+
sess.rollback()
diff --git a/test/orm/test_manytomany.py b/test/orm/test_manytomany.py
index 0e7a6e40f..9764ed684 100644
--- a/test/orm/test_manytomany.py
+++ b/test/orm/test_manytomany.py
@@ -165,11 +165,11 @@ class M2MTest(_base.MappedTest):
sess.add_all([p1, p2])
p1.parent_places.append(p2)
sess.flush()
-
+
sess.expire_all()
assert p1 in p2.parent_places
assert p2 in p1.parent_places
-
+
@testing.resolve_artifact_names
def test_double(self):
@@ -241,7 +241,7 @@ class M2MTest(_base.MappedTest):
passive_updates=False)
})
mapper(Transition, transition)
-
+
p1 = Place('place1')
t1 = Transition('t1')
p1.transitions.append(t1)
@@ -251,10 +251,10 @@ class M2MTest(_base.MappedTest):
p1.place_id
p1.transitions
-
+
sess.execute("delete from place_input", mapper=Place)
p1.place_id = 7
-
+
assert_raises_message(
orm_exc.StaleDataError,
r"UPDATE statement on table 'place_input' expected to "
@@ -262,7 +262,7 @@ class M2MTest(_base.MappedTest):
sess.commit
)
sess.rollback()
-
+
p1.place_id
p1.transitions
sess.execute("delete from place_input", mapper=Place)
@@ -273,7 +273,7 @@ class M2MTest(_base.MappedTest):
r"delete 1 row\(s\); Only 0 were matched.",
sess.commit
)
-
+
class M2MTest2(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -327,7 +327,7 @@ class M2MTest2(_base.MappedTest):
@testing.resolve_artifact_names
def test_dupliates_raise(self):
"""test constraint error is raised for dupe entries in a list"""
-
+
mapper(Student, student)
mapper(Course, course, properties={
'students': relationship(Student, enroll, backref='courses')})
@@ -339,7 +339,7 @@ class M2MTest2(_base.MappedTest):
s1.courses.append(c1)
sess.add(s1)
assert_raises(sa.exc.DBAPIError, sess.flush)
-
+
@testing.resolve_artifact_names
def test_delete(self):
"""A many-to-many table gets cleared out with deletion from the backref side"""
@@ -406,7 +406,7 @@ class M2MTest3(_base.MappedTest):
'a2s': relationship(A, secondary=c2a2, lazy='joined')})
assert create_session().query(C).with_labels().statement is not None
-
+
# TODO: seems like just a test for an ancient exception throw.
# how about some data/inserts/queries/assertions for this one
@@ -427,7 +427,7 @@ class M2MTest4(_base.MappedTest):
Column('t1', Integer, ForeignKey('table1.col1')),
Column('t2', Integer, ForeignKey('table2.col1')),
)
-
+
@testing.resolve_artifact_names
def test_delete_parent(self):
class A(_base.ComparableEntity):
diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py
index 54613c222..2cc180895 100644
--- a/test/orm/test_mapper.py
+++ b/test/orm/test_mapper.py
@@ -31,7 +31,7 @@ class MapperTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_update_attr_keys(self):
"""test that update()/insert() use the correct key when given InstrumentedAttributes."""
-
+
mapper(User, users, properties={
'foobar':users.c.name
})
@@ -41,11 +41,11 @@ class MapperTest(_fixtures.FixtureTest):
users.update().values({User.foobar:User.foobar + 'foo'}).execute()
eq_(sa.select([User.foobar]).where(User.foobar=='name1foo').execute().fetchall(), [('name1foo',)])
-
+
@testing.resolve_artifact_names
def test_utils(self):
from sqlalchemy.orm.util import _is_mapped_class, _is_aliased_class
-
+
class Foo(object):
x = "something"
@property
@@ -53,7 +53,7 @@ class MapperTest(_fixtures.FixtureTest):
return "somethign else"
m = mapper(Foo, users)
a1 = aliased(Foo)
-
+
f = Foo()
for fn, arg, ret in [
@@ -93,13 +93,13 @@ class MapperTest(_fixtures.FixtureTest):
"""test preservation of mapper compile errors raised during hasattr(),
as well as for redundant mapper compile calls. Test that
repeated calls don't stack up error messages.
-
+
"""
-
+
mapper(Address, addresses, properties={
'user':relationship(User)
})
-
+
hasattr(Address.user, 'property')
for i in range(3):
assert_raises_message(sa.exc.InvalidRequestError,
@@ -109,7 +109,7 @@ class MapperTest(_fixtures.FixtureTest):
"Original exception was: Class "
"'test.orm._fixtures.User' is not mapped$"
, configure_mappers)
-
+
@testing.resolve_artifact_names
def test_column_prefix(self):
mapper(User, users, column_prefix='_', properties={
@@ -175,7 +175,7 @@ class MapperTest(_fixtures.FixtureTest):
"not represented in the mapper's table",
mapper, User, users, properties={'foo'
: addresses.c.user_id})
-
+
@testing.resolve_artifact_names
def test_constructor_exc(self):
"""TypeError is raised for illegal constructor args,
@@ -248,12 +248,12 @@ class MapperTest(_fixtures.FixtureTest):
m= mapper(User, users)
assert not m.configured
configure_mappers()
-
+
m2 = mapper(Address, addresses, properties={
'user':relationship(User, backref='addresses')
})
assert m.get_property('addresses')
-
+
@testing.resolve_artifact_names
def test_add_property(self):
assert_col = []
@@ -279,7 +279,7 @@ class MapperTest(_fixtures.FixtureTest):
class UCComparator(sa.orm.PropComparator):
__hash__ = None
-
+
def __eq__(self, other):
cls = self.prop.parent.class_
col = getattr(cls, 'name')
@@ -452,7 +452,7 @@ class MapperTest(_fixtures.FixtureTest):
def name(self):
pass
class Empty(object):pass
-
+
empty = mapper(Empty, t, properties={'empty_id' : t.c.id},
include_properties=[])
p_m = mapper(Person, t, polymorphic_on=t.c.type,
@@ -473,12 +473,12 @@ class MapperTest(_fixtures.FixtureTest):
column_prefix="p_")
hd_m = mapper(HasDef, t, column_prefix="h_")
-
+
fb_m = mapper(Fub, t, include_properties=(t.c.id, t.c.type))
frb_m = mapper(Frob, t, column_prefix='f_',
exclude_properties=(t.c.boss_id,
'employee_number', t.c.vendor_id))
-
+
configure_mappers()
def assert_props(cls, want):
@@ -490,9 +490,9 @@ class MapperTest(_fixtures.FixtureTest):
have = set([p.key for p in class_mapper(cls).iterate_properties])
want = set(want)
eq_(have, want)
-
+
assert_props(HasDef, ['h_boss_id', 'h_employee_number', 'h_id',
- 'name', 'h_name', 'h_vendor_id', 'h_type'])
+ 'name', 'h_name', 'h_vendor_id', 'h_type'])
assert_props(Person, ['id', 'name', 'type'])
assert_instrumented(Person, ['id', 'name', 'type'])
assert_props(Employee, ['boss', 'boss_id', 'employee_number',
@@ -501,10 +501,10 @@ class MapperTest(_fixtures.FixtureTest):
'id', 'name', 'type'])
assert_props(Manager, ['boss', 'boss_id', 'employee_number', 'peon',
'id', 'name', 'type'])
-
+
# 'peon' and 'type' are both explicitly stated properties
assert_instrumented(Manager, ['peon', 'type', 'id'])
-
+
assert_props(Vendor, ['vendor_id', 'id', 'name', 'type'])
assert_props(Hoho, ['id', 'name', 'type'])
assert_props(Lala, ['p_employee_number', 'p_id', 'p_name', 'p_type'])
@@ -521,11 +521,11 @@ class MapperTest(_fixtures.FixtureTest):
Foo, inherits=Person, polymorphic_identity='foo',
exclude_properties=('type', ),
)
-
+
@testing.resolve_artifact_names
def test_mapping_to_join_raises(self):
"""Test implicit merging of two cols raises."""
-
+
usersaddresses = sa.join(users, addresses,
users.c.id == addresses.c.user_id)
assert_raises_message(
@@ -624,12 +624,12 @@ class MapperTest(_fixtures.FixtureTest):
m1 = mapper(Item, items, primary_key=[items.c.id])
m2 = mapper(Keyword, keywords, primary_key=keywords.c.id)
m3 = mapper(User, users, primary_key=(users.c.id,))
-
+
assert m1.primary_key[0] is items.c.id
assert m2.primary_key[0] is keywords.c.id
assert m3.primary_key[0] is users.c.id
-
-
+
+
@testing.resolve_artifact_names
def test_custom_join(self):
"""select_from totally replace the FROM parameters."""
@@ -668,7 +668,7 @@ class MapperTest(_fixtures.FixtureTest):
create_session().query(User).order_by(User.name).all(),
[User(id=10, name=u'chuck'), User(id=8, name=u'ed'), User(id=9, name=u'fred'), User(id=7, name=u'jack')]
)
-
+
# 'Raises a "expression evaluation not supported" error at prepare time
@testing.fails_on('firebird', 'FIXME: unknown')
@testing.resolve_artifact_names
@@ -731,14 +731,14 @@ class MapperTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_override_2(self):
"""exclude_properties cancels the error."""
-
+
mapper(User, users,
exclude_properties=['name'],
properties=dict(
name=relationship(mapper(Address, addresses))))
-
+
assert bool(User.name)
-
+
@testing.resolve_artifact_names
def test_override_3(self):
"""The column being named elsewhere also cancels the error,"""
@@ -771,7 +771,7 @@ class MapperTest(_fixtures.FixtureTest):
adlist = synonym('addresses'),
adname = synonym('addresses')
))
-
+
# ensure the synonym can get at the proxied comparators without
# an explicit compile
User.name == 'ed'
@@ -783,16 +783,16 @@ class MapperTest(_fixtures.FixtureTest):
# test compile
assert not isinstance(User.uname == 'jack', bool)
-
+
assert User.uname.property
assert User.adlist.property
-
+
sess = create_session()
-
+
# test RowTuple names
row = sess.query(User.id, User.uname).first()
assert row.uname == row[1]
-
+
u = sess.query(User).filter(User.uname=='jack').one()
fixture = self.static.user_address_result[0].addresses
@@ -886,22 +886,22 @@ class MapperTest(_fixtures.FixtureTest):
def test_comparable(self):
class extendedproperty(property):
attribute = 123
-
+
def method1(self):
return "method1"
-
+
def __getitem__(self, key):
return 'value'
class UCComparator(sa.orm.PropComparator):
__hash__ = None
-
+
def method1(self):
return "uccmethod1"
-
+
def method2(self, other):
return "method2"
-
+
def __eq__(self, other):
cls = self.prop.parent.class_
col = getattr(cls, 'name')
@@ -940,7 +940,7 @@ class MapperTest(_fixtures.FixtureTest):
AttributeError,
"Neither 'extendedproperty' object nor 'UCComparator' object has an attribute 'nonexistent'",
getattr, User.uc_name, 'nonexistent')
-
+
# test compile
assert not isinstance(User.uc_name == 'jack', bool)
u = q.filter(User.uc_name=='JACK').one()
@@ -973,15 +973,15 @@ class MapperTest(_fixtures.FixtureTest):
def __eq__(self, other):
# lower case comparison
return func.lower(self.__clause_element__()) == func.lower(other)
-
+
def intersects(self, other):
# non-standard comparator
return self.__clause_element__().op('&=')(other)
-
+
mapper(User, users, properties={
'name':sa.orm.column_property(users.c.name, comparator_factory=MyComparator)
})
-
+
assert_raises_message(
AttributeError,
"Neither 'InstrumentedAttribute' object nor 'MyComparator' object has an attribute 'nonexistent'",
@@ -989,7 +989,7 @@ class MapperTest(_fixtures.FixtureTest):
eq_(str((User.name == 'ed').compile(dialect=sa.engine.default.DefaultDialect())) , "lower(users.name) = lower(:lower_1)")
eq_(str((User.name.intersects('ed')).compile(dialect=sa.engine.default.DefaultDialect())), "users.name &= :name_1")
-
+
@testing.resolve_artifact_names
def test_reentrant_compile(self):
@@ -997,7 +997,7 @@ class MapperTest(_fixtures.FixtureTest):
def post_instrument_class(self, mapper):
super(MyFakeProperty, self).post_instrument_class(mapper)
configure_mappers()
-
+
m1 = mapper(User, users, properties={
'name':MyFakeProperty(users.c.name)
})
@@ -1009,13 +1009,13 @@ class MapperTest(_fixtures.FixtureTest):
def post_instrument_class(self, mapper):
super(MyFakeProperty, self).post_instrument_class(mapper)
configure_mappers()
-
+
m1 = mapper(User, users, properties={
'name':MyFakeProperty(users.c.name)
})
m2 = mapper(Address, addresses)
configure_mappers()
-
+
@testing.resolve_artifact_names
def test_reconstructor(self):
recon = []
@@ -1105,7 +1105,7 @@ class MapperTest(_fixtures.FixtureTest):
pass
class Sub(Base):
pass
-
+
mapper(Base, users)
sa.orm.configure_mappers()
@@ -1126,14 +1126,14 @@ class MapperTest(_fixtures.FixtureTest):
def test_unmapped_subclass_error_premap(self):
class Base(object):
pass
-
+
mapper(Base, users)
-
+
class Sub(Base):
pass
sa.orm.configure_mappers()
-
+
# we can create new instances, set attributes.
s = Sub()
s.name = 'foo'
@@ -1142,11 +1142,11 @@ class MapperTest(_fixtures.FixtureTest):
attributes.get_history(s, 'name'),
(['foo'], (), ())
)
-
+
# using it with an ORM operation, raises
assert_raises(sa.orm.exc.UnmappedClassError,
create_session().add, Sub())
-
+
@testing.resolve_artifact_names
def test_oldstyle_mixin(self):
class OldStyle:
@@ -1165,7 +1165,7 @@ class MapperTest(_fixtures.FixtureTest):
mapper(B, users)
class DocumentTest(testing.TestBase):
-
+
def test_doc_propagate(self):
metadata = MetaData()
t1 = Table('t1', metadata,
@@ -1183,10 +1183,10 @@ class DocumentTest(testing.TestBase):
class Foo(object):
pass
-
+
class Bar(object):
pass
-
+
mapper(Foo, t1, properties={
'bars':relationship(Bar,
doc="bar relationship",
@@ -1205,11 +1205,11 @@ class DocumentTest(testing.TestBase):
eq_(Foo.hoho.__doc__, "syn of col4")
eq_(Bar.col1.__doc__, "primary key column")
eq_(Bar.foo.__doc__, "foo relationship")
-
-
-
+
+
+
class OptionsTest(_fixtures.FixtureTest):
-
+
@testing.fails_if(lambda: True, "0.7 regression, may not support "
"synonyms for relationship")
@testing.fails_on('maxdb', 'FIXME: unknown')
@@ -1219,7 +1219,7 @@ class OptionsTest(_fixtures.FixtureTest):
addresses = relationship(mapper(Address, addresses), lazy='select',
order_by=addresses.c.id),
adlist = synonym('addresses')))
-
+
def go():
sess = create_session()
u = (sess.query(User).
@@ -1379,9 +1379,9 @@ class OptionsTest(_fixtures.FixtureTest):
items = relationship(Item, secondary=order_items)
))
mapper(Item, items)
-
+
sess = create_session()
-
+
oalias = aliased(Order)
opt1 = sa.orm.joinedload(User.orders, Order.items)
opt2a, opt2b = sa.orm.contains_eager(User.orders, Order.items, alias=oalias)
@@ -1390,7 +1390,7 @@ class OptionsTest(_fixtures.FixtureTest):
assert opt1 in ustate.load_options
assert opt2a not in ustate.load_options
assert opt2b not in ustate.load_options
-
+
import pickle
pickle.dumps(u1)
@@ -1424,7 +1424,7 @@ class DeepOptionsTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_deep_options_2(self):
"""test (joined|subquery)load_all() options"""
-
+
sess = create_session()
l = (sess.query(User).
@@ -1491,7 +1491,7 @@ class ValidatorTest(_fixtures.FixtureTest):
def validate_name(self, key, name):
assert name != 'fred'
return name + ' modified'
-
+
mapper(User, users)
sess = create_session()
u1 = User(name='ed')
@@ -1502,7 +1502,7 @@ class ValidatorTest(_fixtures.FixtureTest):
sess.flush()
sess.expunge_all()
eq_(sess.query(User).filter_by(name='ed modified').one(), User(name='ed'))
-
+
@testing.resolve_artifact_names
def test_collection(self):
@@ -1511,7 +1511,7 @@ class ValidatorTest(_fixtures.FixtureTest):
def validate_address(self, key, ad):
assert '@' in ad.email_address
return ad
-
+
mapper(User, users, properties={'addresses':relationship(Address)})
mapper(Address, addresses)
sess = create_session()
@@ -1532,12 +1532,12 @@ class ComparatorFactoryTest(_fixtures.FixtureTest, AssertsCompiledSQL):
class DummyComposite(object):
def __init__(self, x, y):
pass
-
+
from sqlalchemy.orm.interfaces import PropComparator
-
+
class MyFactory(PropComparator):
pass
-
+
for args in (
(column_property, users.c.name),
(deferred, users.c.name),
@@ -1551,11 +1551,11 @@ class ComparatorFactoryTest(_fixtures.FixtureTest, AssertsCompiledSQL):
fn = args[0]
args = args[1:]
fn(comparator_factory=MyFactory, *args)
-
+
@testing.resolve_artifact_names
def test_column(self):
from sqlalchemy.orm.properties import ColumnProperty
-
+
class MyFactory(ColumnProperty.Comparator):
__hash__ = None
def __eq__(self, other):
@@ -1581,7 +1581,7 @@ class ComparatorFactoryTest(_fixtures.FixtureTest, AssertsCompiledSQL):
User.name == 'ed',
"foobar(users.name) = foobar(:foobar_1)",
dialect=default.DefaultDialect())
-
+
self.assert_compile(
aliased(User).name == 'ed',
"foobar(users_1.name) = foobar(:foobar_1)",
@@ -1600,7 +1600,7 @@ class ComparatorFactoryTest(_fixtures.FixtureTest, AssertsCompiledSQL):
__hash__ = None
def __eq__(self, other):
return func.foobar(self.__clause_element__().c.id) == func.foobar(other.user_id)
-
+
mapper(User, users)
mapper(Address, addresses, properties={
'user':relationship(User, comparator_factory=MyFactory,
@@ -1614,7 +1614,7 @@ class ComparatorFactoryTest(_fixtures.FixtureTest, AssertsCompiledSQL):
self.assert_compile(aliased(Address).user == User(id=5), "foobar(addresses_1.user_id) = foobar(:foobar_1)", dialect=default.DefaultDialect())
self.assert_compile(aliased(User).addresses == Address(id=5, user_id=7), "foobar(users_1.id) = foobar(:foobar_1)", dialect=default.DefaultDialect())
-
+
class DeferredTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
@@ -1664,7 +1664,7 @@ class DeferredTest(_fixtures.FixtureTest):
'isopen':synonym('_isopen', map_column=True),
'description':deferred(orders.c.description, group='foo')
})
-
+
sess = create_session()
o1 = sess.query(Order).get(1)
eq_(o1.description, "order 1")
@@ -1810,7 +1810,7 @@ class DeferredTest(_fixtures.FixtureTest):
def go():
q.all()[0].user_id
-
+
self.sql_eq_(go, [
("SELECT orders.id AS orders_id, "
"orders.address_id AS orders_address_id, "
@@ -1913,7 +1913,7 @@ class SecondaryOptionsTest(_base.MappedTest):
run_inserts = 'once'
run_deletes = None
-
+
@classmethod
def define_tables(cls, metadata):
Table("base", metadata,
@@ -1930,7 +1930,7 @@ class SecondaryOptionsTest(_base.MappedTest):
Table('related', metadata,
Column('id', Integer, ForeignKey('base.id'), primary_key=True),
)
-
+
@classmethod
@testing.resolve_artifact_names
def setup_mappers(cls):
@@ -1950,7 +1950,7 @@ class SecondaryOptionsTest(_base.MappedTest):
})
mapper(Child2, child2, inherits=Base, polymorphic_identity='child2')
mapper(Related, related)
-
+
@classmethod
@testing.resolve_artifact_names
def insert_data(cls):
@@ -1980,12 +1980,12 @@ class SecondaryOptionsTest(_base.MappedTest):
{'id':5},
{'id':6},
])
-
+
@testing.resolve_artifact_names
def test_contains_eager(self):
sess = create_session()
-
-
+
+
child1s = sess.query(Child1).join(Child1.related).options(sa.orm.contains_eager(Child1.related)).order_by(Child1.id)
def go():
@@ -1994,7 +1994,7 @@ class SecondaryOptionsTest(_base.MappedTest):
[Child1(id=1, related=Related(id=1)), Child1(id=2, related=Related(id=2)), Child1(id=3, related=Related(id=3))]
)
self.assert_sql_count(testing.db, go, 1)
-
+
c1 = child1s[0]
self.assert_sql_execution(
@@ -2020,7 +2020,7 @@ class SecondaryOptionsTest(_base.MappedTest):
[Child1(id=1, related=Related(id=1)), Child1(id=2, related=Related(id=2)), Child1(id=3, related=Related(id=3))]
)
self.assert_sql_count(testing.db, go, 1)
-
+
c1 = child1s[0]
self.assert_sql_execution(
@@ -2050,7 +2050,7 @@ class SecondaryOptionsTest(_base.MappedTest):
[Child1(id=1, related=Related(id=1)), Child1(id=2, related=Related(id=2)), Child1(id=3, related=Related(id=3))]
)
self.assert_sql_count(testing.db, go, 4)
-
+
c1 = child1s[0]
# this *does* joinedload
@@ -2064,7 +2064,7 @@ class SecondaryOptionsTest(_base.MappedTest):
{'param_1':4}
)
)
-
+
class DeferredPopulationTest(_base.MappedTest):
@classmethod
@@ -2086,7 +2086,7 @@ class DeferredPopulationTest(_base.MappedTest):
mapper(Human, human, properties={"thing": relationship(Thing)})
mapper(Thing, thing, properties={"name": deferred(thing.c.name)})
-
+
@classmethod
@testing.resolve_artifact_names
def insert_data(cls):
@@ -2097,7 +2097,7 @@ class DeferredPopulationTest(_base.MappedTest):
human.insert().execute([
{"id": 1, "thing_id": 1, "name": "Clark Kent"},
])
-
+
def _test(self, thing):
assert "name" in attributes.instance_state(thing).dict
@@ -2121,7 +2121,7 @@ class DeferredPopulationTest(_base.MappedTest):
result = session.query(Thing).first()
thing = session.query(Thing).options(sa.orm.undefer("name")).first()
self._test(thing)
-
+
@testing.resolve_artifact_names
def test_joinedload_with_clear(self):
session = create_session()
@@ -2151,8 +2151,8 @@ class DeferredPopulationTest(_base.MappedTest):
result = session.query(Human).add_entity(Thing).join("thing").first()
thing = session.query(Thing).options(sa.orm.undefer("name")).first()
self._test(thing)
-
-
+
+
class NoLoadTest(_fixtures.FixtureTest):
@@ -2195,8 +2195,8 @@ class NoLoadTest(_fixtures.FixtureTest):
)
-
-
+
+
class RequirementsTest(_base.MappedTest):
"""Tests the contract for user classes."""
@@ -2232,14 +2232,14 @@ class RequirementsTest(_base.MappedTest):
assert_raises(sa.exc.ArgumentError, mapper, OldStyle, ht1)
assert_raises(sa.exc.ArgumentError, mapper, 123)
-
+
class NoWeakrefSupport(str):
pass
# TODO: is weakref support detectable without an instance?
#self.assertRaises(sa.exc.ArgumentError, mapper, NoWeakrefSupport, t2)
# end Py2K
-
+
@testing.resolve_artifact_names
def test_comparison_overrides(self):
"""Simple tests to ensure users can supply comparison __methods__.
@@ -2340,7 +2340,7 @@ class RequirementsTest(_base.MappedTest):
class H1(object):
def __len__(self):
return len(self.get_value())
-
+
def get_value(self):
self.value = "foobar"
return self.value
@@ -2352,10 +2352,10 @@ class RequirementsTest(_base.MappedTest):
def get_value(self):
self.value = "foobar"
return self.value
-
+
mapper(H1, ht1)
mapper(H2, ht1)
-
+
h1 = H1()
h1.value = "Asdf"
h1.value = "asdf asdf" # ding
@@ -2363,7 +2363,7 @@ class RequirementsTest(_base.MappedTest):
h2 = H2()
h2.value = "Asdf"
h2.value = "asdf asdf" # ding
-
+
class MagicNamesTest(_base.MappedTest):
@classmethod
@@ -2403,7 +2403,7 @@ class MagicNamesTest(_base.MappedTest):
sess.add(c)
sess.flush()
sess.expunge_all()
-
+
for C, M in ((Cartographer, Map),
(sa.orm.aliased(Cartographer), sa.orm.aliased(Map))):
c1 = (sess.query(C).
diff --git a/test/orm/test_merge.py b/test/orm/test_merge.py
index 1eafa59e8..d07efd987 100644
--- a/test/orm/test_merge.py
+++ b/test/orm/test_merge.py
@@ -53,7 +53,7 @@ class MergeTest(_fixtures.FixtureTest):
def go():
sess.merge(u)
self.assert_sql_count(testing.db, go, 0)
-
+
@testing.resolve_artifact_names
def test_transient_to_pending_collection(self):
mapper(User, users, properties={
@@ -241,9 +241,9 @@ class MergeTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_merge_empty_attributes(self):
mapper(User, dingalings)
-
+
sess = create_session()
-
+
# merge empty stuff. goes in as NULL.
# not sure what this was originally trying to
# test.
@@ -255,17 +255,17 @@ class MergeTest(_fixtures.FixtureTest):
u2 = User(id=2, data="foo")
sess.add(u2)
sess.flush()
-
+
# merge User on u2's pk with
# no "data".
# value isn't whacked from the destination
# dict.
u3 = sess.merge(User(id=2))
eq_(u3.__dict__['data'], "foo")
-
+
# make a change.
u3.data = 'bar'
-
+
# merge another no-"data" user.
# attribute maintains modified state.
# (usually autoflush would have happened
@@ -281,12 +281,12 @@ class MergeTest(_fixtures.FixtureTest):
u5 = User(id=3, data="foo")
sess.add(u5)
sess.flush()
-
+
# blow it away from u5, but don't
# mark as expired. so it would just
# be blank.
del u5.data
-
+
# the merge adds expiry to the
# attribute so that it loads.
# not sure if I like this - it currently is needed
@@ -300,8 +300,8 @@ class MergeTest(_fixtures.FixtureTest):
u6.data = None
u7 = sess.merge(User(id=3))
assert u6.__dict__['data'] is None
-
-
+
+
@testing.resolve_artifact_names
def test_merge_irregular_collection(self):
mapper(User, users, properties={
@@ -427,27 +427,27 @@ class MergeTest(_fixtures.FixtureTest):
a1 = Address(email_address="asdf", user=u1)
sess.add(a1)
sess.flush()
-
+
a2 = Address(id=a1.id, email_address="bar", user=User(name="hoho"))
a2 = sess.merge(a2)
sess.flush()
-
+
# no expire of the attribute
-
+
assert a2.__dict__['user'] is u1
-
+
# merge succeeded
eq_(
sess.query(Address).all(),
[Address(id=a1.id, email_address="bar")]
)
-
+
# didn't touch user
eq_(
sess.query(User).all(),
[User(name="fred")]
)
-
+
@testing.resolve_artifact_names
def test_one_to_many_cascade(self):
@@ -492,17 +492,17 @@ class MergeTest(_fixtures.FixtureTest):
'user':relationship(User)
})
mapper(User, users)
-
+
u1 = User(id=1, name="u1")
a1 =Address(id=1, email_address="a1", user=u1)
u2 = User(id=2, name="u2")
-
+
sess = create_session()
sess.add_all([a1, u2])
sess.flush()
-
+
a1.user = u2
-
+
sess2 = create_session()
a2 = sess2.merge(a1)
eq_(
@@ -510,9 +510,9 @@ class MergeTest(_fixtures.FixtureTest):
([u2], (), [attributes.PASSIVE_NO_RESULT])
)
assert a2 in sess2.dirty
-
+
sess.refresh(a1)
-
+
sess2 = create_session()
a2 = sess2.merge(a1, load=False)
eq_(
@@ -520,7 +520,7 @@ class MergeTest(_fixtures.FixtureTest):
((), [u1], ())
)
assert a2 not in sess2.dirty
-
+
@testing.resolve_artifact_names
def test_many_to_many_cascade(self):
@@ -609,18 +609,18 @@ class MergeTest(_fixtures.FixtureTest):
sess.add(u)
sess.commit()
sess.close()
-
+
u2 = User(id=7, name=None, address=None)
u3 = sess.merge(u2)
assert u3.name is None
assert u3.address is None
-
+
sess.close()
-
+
a1 = Address(id=1, user=None)
a2 = sess.merge(a1)
assert a2.user is None
-
+
@testing.resolve_artifact_names
def test_transient_no_load(self):
mapper(User, users)
@@ -863,7 +863,7 @@ class MergeTest(_fixtures.FixtureTest):
'uid':synonym('id'),
'foobar':comparable_property(User.Comparator,User.value),
})
-
+
sess = create_session()
u = User()
u.name = 'ed'
@@ -875,7 +875,7 @@ class MergeTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_cascade_doesnt_blowaway_manytoone(self):
"""a merge test that was fixed by [ticket:1202]"""
-
+
s = create_session(autoflush=True)
mapper(User, users, properties={
'addresses':relationship(mapper(Address, addresses),backref='user')})
@@ -889,7 +889,7 @@ class MergeTest(_fixtures.FixtureTest):
eq_(after_id, other_id)
eq_(before_id, after_id)
eq_(a1.user, a2.user)
-
+
@testing.resolve_artifact_names
def test_cascades_dont_autoflush(self):
sess = create_session(autoflush=True)
@@ -930,7 +930,7 @@ class MergeTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_dont_expire_pending(self):
"""test that pending instances aren't expired during a merge."""
-
+
mapper(User, users)
u = User(id=7)
sess = create_session(autoflush=True, autocommit=False)
@@ -939,40 +939,40 @@ class MergeTest(_fixtures.FixtureTest):
def go():
eq_(u.name, None)
self.assert_sql_count(testing.db, go, 0)
-
+
@testing.resolve_artifact_names
def test_option_state(self):
"""test that the merged takes on the MapperOption characteristics
of that which is merged.
-
+
"""
class Option(MapperOption):
propagate_to_loaders = True
-
+
opt1, opt2 = Option(), Option()
sess = sessionmaker()()
-
+
umapper = mapper(User, users)
-
+
sess.add_all([
User(id=1, name='u1'),
User(id=2, name='u2'),
])
sess.commit()
-
+
sess2 = sessionmaker()()
s2_users = sess2.query(User).options(opt2).all()
-
+
# test 1. no options are replaced by merge options
sess = sessionmaker()()
s1_users = sess.query(User).all()
-
+
for u in s1_users:
ustate = attributes.instance_state(u)
eq_(ustate.load_path, ())
eq_(ustate.load_options, set())
-
+
for u in s2_users:
sess.merge(u)
@@ -980,7 +980,7 @@ class MergeTest(_fixtures.FixtureTest):
ustate = attributes.instance_state(u)
eq_(ustate.load_path, (umapper, ))
eq_(ustate.load_options, set([opt2]))
-
+
# test 2. present options are replaced by merge options
sess = sessionmaker()()
s1_users = sess.query(User).options(opt1).all()
@@ -991,12 +991,12 @@ class MergeTest(_fixtures.FixtureTest):
for u in s2_users:
sess.merge(u)
-
+
for u in s1_users:
ustate = attributes.instance_state(u)
eq_(ustate.load_path, (umapper, ))
eq_(ustate.load_options, set([opt2]))
-
+
class MutableMergeTest(_base.MappedTest):
@classmethod
@@ -1005,27 +1005,27 @@ class MutableMergeTest(_base.MappedTest):
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
Column('data', PickleType(comparator=operator.eq))
)
-
+
@classmethod
def setup_classes(cls):
class Data(_base.ComparableEntity):
pass
-
+
@testing.resolve_artifact_names
def test_list(self):
mapper(Data, data)
sess = sessionmaker()()
d = Data(data=["this", "is", "a", "list"])
-
+
sess.add(d)
sess.commit()
-
+
d2 = Data(id=d.id, data=["this", "is", "another", "list"])
d3 = sess.merge(d2)
eq_(d3.data, ["this", "is", "another", "list"])
-
-
-
+
+
+
class CompositeNullPksTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -1033,19 +1033,19 @@ class CompositeNullPksTest(_base.MappedTest):
Column('pk1', String(10), primary_key=True),
Column('pk2', String(10), primary_key=True),
)
-
+
@classmethod
def setup_classes(cls):
class Data(_base.ComparableEntity):
pass
-
+
@testing.resolve_artifact_names
def test_merge_allow_partial(self):
mapper(Data, data)
sess = sessionmaker()()
-
+
d1 = Data(pk1="someval", pk2=None)
-
+
def go():
return sess.merge(d1)
self.assert_sql_count(testing.db, go, 1)
@@ -1060,5 +1060,5 @@ class CompositeNullPksTest(_base.MappedTest):
def go():
return sess.merge(d1)
self.assert_sql_count(testing.db, go, 0)
-
+
diff --git a/test/orm/test_naturalpks.py b/test/orm/test_naturalpks.py
index f9ce7b3ca..18ebb5bba 100644
--- a/test/orm/test_naturalpks.py
+++ b/test/orm/test_naturalpks.py
@@ -21,7 +21,7 @@ class NaturalPKTest(_base.MappedTest):
fk_args = dict(deferrable=True, initially='deferred')
else:
fk_args = dict(onupdate='cascade')
-
+
users = Table('users', metadata,
Column('username', String(50), primary_key=True),
Column('fullname', String(100)),
@@ -118,7 +118,7 @@ class NaturalPKTest(_base.MappedTest):
sess.flush()
sess.expunge_all()
assert sess.query(User).get('ed').fullname == 'jack'
-
+
@testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
@testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
@@ -177,7 +177,7 @@ class NaturalPKTest(_base.MappedTest):
assert sess.query(Address).get('jack1').username is None
u1 = sess.query(User).get('fred')
eq_(User(username='fred', fullname='jack'), u1)
-
+
@testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
@testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
@@ -243,7 +243,7 @@ class NaturalPKTest(_base.MappedTest):
u1 = User(username='jack', fullname='jack')
sess.add(u1)
sess.flush()
-
+
a1 = Address(email='jack1')
u1.address = a1
sess.add(a1)
@@ -265,7 +265,7 @@ class NaturalPKTest(_base.MappedTest):
sess.expunge_all()
eq_([Address(username='ed')], sess.query(Address).all())
-
+
@testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
@testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
def test_bidirectional_passive(self):
@@ -376,7 +376,7 @@ class NaturalPKTest(_base.MappedTest):
eq_(['jack'], [u.username for u in r[0].users])
eq_(Item(itemname='item2'), r[1])
eq_(['ed', 'jack'], sorted([u.username for u in r[1].users]))
-
+
sess.expunge_all()
u2 = sess.query(User).get(u2.username)
u2.username='wendy'
@@ -386,41 +386,41 @@ class NaturalPKTest(_base.MappedTest):
class TransientExceptionTesst(_fixtures.FixtureTest):
run_inserts = None
-
+
@testing.resolve_artifact_names
def test_transient_exception(self):
"""An object that goes from a pk value to transient/pending
doesn't count as a "pk" switch.
-
+
"""
mapper(User, users)
mapper(Address, addresses, properties={'user':relationship(User)})
-
+
sess = create_session()
u1 = User(id=5, name='u1')
ad1 = Address(email_address='e1', user=u1)
sess.add_all([u1, ad1])
sess.flush()
-
+
make_transient(u1)
u1.id = None
u1.username='u2'
sess.add(u1)
sess.flush()
-
+
eq_(ad1.user_id, 5)
-
+
sess.expire_all()
eq_(ad1.user_id, 5)
ne_(u1.id, 5)
ne_(u1.id, None)
eq_(sess.query(User).count(), 2)
-
+
class ReversePKsTest(_base.MappedTest):
"""reverse the primary keys of two entities and ensure bookkeeping
succeeds."""
-
-
+
+
@classmethod
def define_tables(cls, metadata):
Table(
@@ -429,7 +429,7 @@ class ReversePKsTest(_base.MappedTest):
Column('status', Integer, primary_key=True),
Column('username', Unicode(50), nullable=False),
)
-
+
@classmethod
def setup_classes(cls):
class User(_base.ComparableEntity):
@@ -441,11 +441,11 @@ class ReversePKsTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_reverse(self):
PUBLISHED, EDITABLE, ARCHIVED = 1, 2, 3
-
+
mapper(User, user)
session = sa.orm.sessionmaker()()
-
+
a_published = User(1, PUBLISHED, u'a')
session.add(a_published)
session.commit()
@@ -473,7 +473,7 @@ class ReversePKsTest(_base.MappedTest):
assert session.query(User).get([1, PUBLISHED]) is a_published
assert session.query(User).get([1, EDITABLE]) is a_editable
-
+
class SelfReferentialTest(_base.MappedTest):
# mssql, mysql don't allow
# ON UPDATE on self-referential keys
@@ -485,7 +485,7 @@ class SelfReferentialTest(_base.MappedTest):
fk_args = dict(deferrable=True, initially='deferred')
else:
fk_args = dict(onupdate='cascade')
-
+
Table('nodes', metadata,
Column('name', String(50), primary_key=True),
Column('parent', String(50),
@@ -515,7 +515,7 @@ class SelfReferentialTest(_base.MappedTest):
n4 = Node(name='n13', parentnode=n1)
sess.add_all([n2, n3, n4])
sess.commit()
-
+
n1.name = 'new n1'
sess.commit()
eq_(['new n1', 'new n1', 'new n1'],
@@ -686,7 +686,7 @@ class NonPKCascadeTest(_base.MappedTest):
class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
"""A primary key mutation cascades onto a foreign key that is itself a
primary key."""
-
+
@classmethod
def define_tables(cls, metadata):
if testing.against('oracle'):
@@ -714,7 +714,7 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
pass
class Address(_base.ComparableEntity):
pass
-
+
@testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
@testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
def test_onetomany_passive(self):
@@ -724,20 +724,20 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
@testing.fails_on_everything_except('sqlite', 'oracle', '+zxjdbc')
def test_onetomany_nonpassive(self):
self._test_onetomany(False)
-
+
def test_o2m_change_passive(self):
self._test_o2m_change(True)
-
+
def test_o2m_change_nonpassive(self):
self._test_o2m_change(False)
@testing.resolve_artifact_names
def _test_o2m_change(self, passive_updates):
"""Change the PK of a related entity to another.
-
+
"on update cascade" is not involved here, so the mapper has
to do the UPDATE itself.
-
+
"""
mapper(User, users, properties={
'addresses':relationship(Address,
@@ -748,10 +748,10 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
a1 = Address(username='ed', email='ed@host1')
u1 = User(username='ed', addresses=[a1])
u2 = User(username='jack')
-
+
sess.add_all([a1, u1, u2])
sess.flush()
-
+
a1.username = 'jack'
sess.flush()
@@ -783,17 +783,17 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
u1.addresses.remove(a1)
u2.addresses.append(a1)
sess.flush()
-
+
@testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE '
'but requires referential integrity')
@testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
def test_change_m2o_passive(self):
self._test_change_m2o(True)
-
+
@testing.fails_on_everything_except('sqlite', 'oracle', '+zxjdbc')
def test_change_m2o_nonpassive(self):
self._test_change_m2o(False)
-
+
@testing.resolve_artifact_names
def _test_change_m2o(self, passive_updates):
mapper(User, users)
@@ -806,11 +806,11 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
a1 = Address(user=u1, email='foo@bar')
sess.add_all([u1, a1])
sess.flush()
-
+
u1.username='edmodified'
sess.flush()
eq_(a1.username, 'edmodified')
-
+
sess.expire_all()
eq_(a1.username, 'edmodified')
@@ -834,11 +834,11 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
a1 = Address(user=u1, email='foo@bar')
sess.add_all([u1, u2, a1])
sess.flush()
-
+
a1.user = u2
sess.flush()
-
-
+
+
@testing.resolve_artifact_names
def test_rowswitch_doesntfire(self):
mapper(User, users)
@@ -849,11 +849,11 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
sess = create_session()
u1 = User(username='ed')
a1 = Address(user=u1, email='ed@host1')
-
+
sess.add(u1)
sess.add(a1)
sess.flush()
-
+
sess.delete(u1)
sess.delete(a1)
@@ -863,7 +863,7 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
sess.add(a2)
from test.lib.assertsql import CompiledSQL
-
+
# test that the primary key columns of addresses are not
# being updated as well, since this is a row switch.
self.assert_sql_execution(testing.db,
@@ -875,22 +875,22 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
{'etc': 'foo', 'addresses_username':'ed',
'addresses_email':'ed@host1'} ),
)
-
-
+
+
@testing.resolve_artifact_names
def _test_onetomany(self, passive_updates):
"""Change the PK of a related entity via foreign key cascade.
-
+
For databases that require "on update cascade", the mapper
has to identify the row by the new value, not the old, when
it does the update.
-
+
"""
mapper(User, users, properties={
'addresses':relationship(Address,
passive_updates=passive_updates)})
mapper(Address, addresses)
-
+
sess = create_session()
a1, a2 = Address(username='ed', email='ed@host1'),\
Address(username='ed', email='ed@host2')
@@ -901,7 +901,7 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
eq_(a2.username, 'ed')
eq_(sa.select([addresses.c.username]).execute().fetchall(),
[('ed',), ('ed',)])
-
+
u1.username = 'jack'
a2.email='ed@host3'
sess.flush()
@@ -914,7 +914,7 @@ class CascadeToFKPKTest(_base.MappedTest, testing.AssertsCompiledSQL):
class JoinedInheritanceTest(_base.MappedTest):
"""Test cascades of pk->pk/fk on joined table inh."""
-
+
# mssql doesn't allow ON UPDATE on self-referential keys
__unsupported_on__ = ('mssql',)
@@ -929,7 +929,7 @@ class JoinedInheritanceTest(_base.MappedTest):
Column('name', String(50), primary_key=True),
Column('type', String(50), nullable=False),
test_needs_fk=True)
-
+
Table('engineer', metadata,
Column('name', String(50), ForeignKey('person.name', **fk_args),
primary_key=True),
@@ -965,12 +965,12 @@ class JoinedInheritanceTest(_base.MappedTest):
@testing.fails_on_everything_except('sqlite', 'oracle', '+zxjdbc')
def test_pk_nonpassive(self):
self._test_pk(False)
-
+
@testing.fails_on('sqlite', 'sqlite doesnt support ON UPDATE CASCADE')
@testing.fails_on('oracle', 'oracle doesnt support ON UPDATE CASCADE')
def test_fk_passive(self):
self._test_fk(True)
-
+
# PG etc. need passive=True to allow PK->PK cascade
@testing.fails_on_everything_except('sqlite', 'mysql+zxjdbc', 'oracle',
'postgresql+zxjdbc')
@@ -1000,7 +1000,7 @@ class JoinedInheritanceTest(_base.MappedTest):
e1.name = 'wally'
e1.primary_language = 'c++'
sess.commit()
-
+
@testing.resolve_artifact_names
def _test_fk(self, passive_updates):
mapper(Person, person, polymorphic_on=person.c.type,
@@ -1015,9 +1015,9 @@ class JoinedInheritanceTest(_base.MappedTest):
})
mapper(Manager, manager, inherits=Person,
polymorphic_identity='manager')
-
+
sess = sa.orm.sessionmaker()()
-
+
m1 = Manager(name='dogbert', paperwork='lots')
e1, e2 = \
Engineer(name='dilbert', primary_language='java', boss=m1),\
@@ -1030,14 +1030,14 @@ class JoinedInheritanceTest(_base.MappedTest):
eq_(e1.boss_name, 'dogbert')
eq_(e2.boss_name, 'dogbert')
sess.expire_all()
-
+
m1.name = 'pointy haired'
e1.primary_language = 'scala'
e2.primary_language = 'cobol'
sess.commit()
-
+
eq_(e1.boss_name, 'pointy haired')
eq_(e2.boss_name, 'pointy haired')
-
-
-
+
+
+
diff --git a/test/orm/test_onetoone.py b/test/orm/test_onetoone.py
index 7097a266e..ff0ac508a 100644
--- a/test/orm/test_onetoone.py
+++ b/test/orm/test_onetoone.py
@@ -47,7 +47,7 @@ class O2OTest(_base.MappedTest):
session.add(j)
p = Port(name='fa0/1')
session.add(p)
-
+
j.port=p
session.flush()
jid = j.id
diff --git a/test/orm/test_pickled.py b/test/orm/test_pickled.py
index 972b298af..3383c48b9 100644
--- a/test/orm/test_pickled.py
+++ b/test/orm/test_pickled.py
@@ -18,7 +18,7 @@ User, EmailUser = None, None
class PickleTest(_fixtures.FixtureTest):
run_inserts = None
-
+
@testing.resolve_artifact_names
def test_transient(self):
mapper(User, users, properties={
@@ -40,7 +40,7 @@ class PickleTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_no_mappers(self):
-
+
umapper = mapper(User, users)
u1 = User(name='ed')
u1_pickled = pickle.dumps(u1, -1)
@@ -67,21 +67,21 @@ class PickleTest(_fixtures.FixtureTest):
# this fails unless the InstanceState
# compiles the mapper
eq_(str(u1), "User(name='ed')")
-
+
@testing.resolve_artifact_names
def test_serialize_path(self):
umapper = mapper(User, users, properties={
'addresses':relationship(Address, backref="user")
})
amapper = mapper(Address, addresses)
-
+
# this is a "relationship" path with mapper, key, mapper, key
p1 = (umapper, 'addresses', amapper, 'email_address')
eq_(
interfaces.deserialize_path(interfaces.serialize_path(p1)),
p1
)
-
+
# this is a "mapper" path with mapper, key, mapper, no key
# at the end.
p2 = (umapper, 'addresses', amapper, )
@@ -89,14 +89,14 @@ class PickleTest(_fixtures.FixtureTest):
interfaces.deserialize_path(interfaces.serialize_path(p2)),
p2
)
-
+
# test a blank path
p3 = ()
eq_(
interfaces.deserialize_path(interfaces.serialize_path(p3)),
p3
)
-
+
@testing.resolve_artifact_names
def test_class_deferred_cols(self):
mapper(User, users, properties={
@@ -134,7 +134,7 @@ class PickleTest(_fixtures.FixtureTest):
'addresses':relationship(Address, lazy='noload')
})
mapper(Address, addresses)
-
+
sess = Session()
u1 = User(name='ed', addresses=[
Address(
@@ -145,16 +145,16 @@ class PickleTest(_fixtures.FixtureTest):
sess.add(u1)
sess.commit()
sess.close()
-
+
u1 = sess.query(User).options(
lazyload(User.addresses)
).first()
u2 = pickle.loads(pickle.dumps(u1))
-
+
sess = Session()
sess.add(u2)
assert u2.addresses
-
+
@testing.resolve_artifact_names
def test_instance_deferred_cols(self):
mapper(User, users, properties={
@@ -192,11 +192,11 @@ class PickleTest(_fixtures.FixtureTest):
eq_(u2.name, 'ed')
assert 'addresses' not in u2.__dict__
ad = u2.addresses[0]
-
+
# mapper options now transmit over merge(),
# new as of 0.6, so email_address is deferred.
- assert 'email_address' not in ad.__dict__
-
+ assert 'email_address' not in ad.__dict__
+
eq_(ad.email_address, 'ed@bar.com')
eq_(u2, User(name='ed', addresses=[Address(email_address='ed@bar.com')]))
@@ -218,7 +218,7 @@ class PickleTest(_fixtures.FixtureTest):
for protocol in -1, 0, 1, 2:
u2 = pickle.loads(pickle.dumps(u1, protocol))
eq_(u1, u2)
-
+
@testing.resolve_artifact_names
def test_options_with_descriptors(self):
mapper(User, users, properties={
@@ -241,17 +241,17 @@ class PickleTest(_fixtures.FixtureTest):
]:
opt2 = pickle.loads(pickle.dumps(opt))
eq_(opt.key, opt2.key)
-
+
u1 = sess.query(User).options(opt).first()
-
+
u2 = pickle.loads(pickle.dumps(u1))
-
+
def test_collection_setstate(self):
"""test a particular cycle that requires CollectionAdapter
to not rely upon InstanceState to deserialize."""
-
+
global Child1, Child2, Parent, Screen
-
+
m = MetaData()
c1 = Table('c1', m,
Column('parent_id', String,
@@ -272,7 +272,7 @@ class PickleTest(_fixtures.FixtureTest):
class Parent(_base.ComparableEntity):
pass
-
+
mapper(Parent, p, properties={
'children1':relationship(Child1),
'children2':relationship(Child2)
@@ -289,7 +289,7 @@ class PickleTest(_fixtures.FixtureTest):
screen1.errors = [obj.children1, obj.children2]
screen2 = Screen(Child2(), screen1)
pickle.loads(pickle.dumps(screen2))
-
+
class PolymorphicDeferredTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -339,7 +339,7 @@ class CustomSetupTeardownTest(_fixtures.FixtureTest):
def test_rebuild_state(self):
"""not much of a 'test', but illustrate how to
remove instance-level state before pickling.
-
+
"""
mapper(User, users)
@@ -349,12 +349,12 @@ class CustomSetupTeardownTest(_fixtures.FixtureTest):
u2 = pickle.loads(pickle.dumps(u1))
attributes.manager_of_class(User).setup_instance(u2)
assert attributes.instance_state(u2)
-
+
class UnpickleSA05Test(_fixtures.FixtureTest):
"""test loading picklestrings from SQLA 0.5."""
-
+
__requires__ = ('python2',)
-
+
@testing.resolve_artifact_names
def test_one(self):
mapper(User, users, properties={
diff --git a/test/orm/test_query.py b/test/orm/test_query.py
index 15ffaff2f..fba77c783 100644
--- a/test/orm/test_query.py
+++ b/test/orm/test_query.py
@@ -66,7 +66,7 @@ class RowTupleTest(QueryTest):
mapper(User, users, properties={
'uname':users.c.name
})
-
+
row = create_session().\
query(User.id, User.uname).\
filter(User.id==7).first()
@@ -125,7 +125,7 @@ class RowTupleTest(QueryTest):
q.column_descriptions,
asserted
)
-
+
class GetTest(QueryTest):
def test_get(self):
s = create_session()
@@ -140,14 +140,14 @@ class GetTest(QueryTest):
def test_get_composite_pk_no_result(self):
s = Session()
assert s.query(CompositePk).get((100,100)) is None
-
+
def test_get_composite_pk_result(self):
s = Session()
one_two = s.query(CompositePk).get((1,2))
assert one_two.i == 1
assert one_two.j == 2
assert one_two.k == 3
-
+
def test_get_too_few_params(self):
s = Session()
q = s.query(CompositePk)
@@ -162,16 +162,16 @@ class GetTest(QueryTest):
s = Session()
q = s.query(CompositePk)
assert_raises(sa_exc.InvalidRequestError, q.get, (7, 10, 100))
-
+
def test_get_null_pk(self):
"""test that a mapping which can have None in a
PK (i.e. map to an outerjoin) works with get()."""
-
+
s = users.outerjoin(addresses)
-
+
class UserThing(_base.ComparableEntity):
pass
-
+
mapper(UserThing, s, properties={
'id':(users.c.id, addresses.c.user_id),
'address_id':addresses.c.id,
@@ -186,11 +186,11 @@ class GetTest(QueryTest):
"""test that get()/load() does not use preexisting filter/etc. criterion"""
s = create_session()
-
+
q = s.query(User).join('addresses').filter(Address.user_id==8)
assert_raises(sa_exc.InvalidRequestError, q.get, 7)
assert_raises(sa_exc.InvalidRequestError, s.query(User).filter(User.id==7).get, 19)
-
+
# order_by()/get() doesn't raise
s.query(User).order_by(User.id).get(8)
@@ -244,7 +244,7 @@ class GetTest(QueryTest):
# Py2K
ustring = 'petit voix m\xe2\x80\x99a'.decode('utf-8')
# end Py2K
-
+
table.insert().execute(id=ustring, data=ustring)
class LocalFoo(Base):
pass
@@ -298,7 +298,7 @@ class GetTest(QueryTest):
class InvalidGenerationsTest(QueryTest, AssertsCompiledSQL):
def test_no_limit_offset(self):
s = create_session()
-
+
for q in (
s.query(User).limit(2),
s.query(User).offset(2),
@@ -315,31 +315,31 @@ class InvalidGenerationsTest(QueryTest, AssertsCompiledSQL):
assert_raises(sa_exc.InvalidRequestError, q.group_by, 'foo')
assert_raises(sa_exc.InvalidRequestError, q.having, 'foo')
-
+
q.enable_assertions(False).join("addresses")
q.enable_assertions(False).filter(User.name=='ed')
q.enable_assertions(False).order_by('foo')
q.enable_assertions(False).group_by('foo')
-
+
def test_no_from(self):
s = create_session()
-
+
q = s.query(User).select_from(users)
assert_raises(sa_exc.InvalidRequestError, q.select_from, users)
q = s.query(User).join('addresses')
assert_raises(sa_exc.InvalidRequestError, q.select_from, users)
-
+
q = s.query(User).order_by(User.id)
assert_raises(sa_exc.InvalidRequestError, q.select_from, users)
assert_raises(sa_exc.InvalidRequestError, q.select_from, users)
-
+
q.enable_assertions(False).select_from(users)
-
+
# this is fine, however
q.from_self()
-
+
def test_invalid_select_from(self):
s = create_session()
q = s.query(User)
@@ -351,15 +351,15 @@ class InvalidGenerationsTest(QueryTest, AssertsCompiledSQL):
q = s.query(User)
assert_raises(sa_exc.ArgumentError, q.from_statement, User.id==5)
assert_raises(sa_exc.ArgumentError, q.from_statement, users.join(addresses))
-
+
def test_invalid_column(self):
s = create_session()
q = s.query(User)
assert_raises(sa_exc.InvalidRequestError, q.add_column, object())
-
+
def test_distinct(self):
"""test that a distinct() call is not valid before 'clauseelement' conditions."""
-
+
s = create_session()
q = s.query(User).distinct()
assert_raises(sa_exc.InvalidRequestError, q.select_from, User)
@@ -374,7 +374,7 @@ class InvalidGenerationsTest(QueryTest, AssertsCompiledSQL):
assert_raises(sa_exc.InvalidRequestError, q.select_from, User)
assert_raises(sa_exc.InvalidRequestError, q.from_statement, text("select * from table"))
assert_raises(sa_exc.InvalidRequestError, q.with_polymorphic, User)
-
+
def test_cancel_order_by(self):
s = create_session()
@@ -399,16 +399,16 @@ class InvalidGenerationsTest(QueryTest, AssertsCompiledSQL):
# after False was set, this should pass
q._no_select_modifiers("foo")
-
+
def test_mapper_zero(self):
s = create_session()
-
+
q = s.query(User, Address)
assert_raises(sa_exc.InvalidRequestError, q.get, 5)
-
+
def test_from_statement(self):
s = create_session()
-
+
q = s.query(User).filter(User.id==5)
assert_raises(sa_exc.InvalidRequestError, q.from_statement, "x")
@@ -423,7 +423,7 @@ class InvalidGenerationsTest(QueryTest, AssertsCompiledSQL):
q = s.query(User).order_by(User.name)
assert_raises(sa_exc.InvalidRequestError, q.from_statement, "x")
-
+
class OperatorTest(QueryTest, AssertsCompiledSQL):
"""test sql.Comparator implementation for MapperProperties"""
@@ -455,7 +455,7 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
def test_comparison(self):
create_session().query(User)
ualias = aliased(User)
-
+
for (py_op, fwd_op, rev_op) in ((operator.lt, '<', '>'),
(operator.gt, '>', '<'),
(operator.eq, '=', '='),
@@ -486,7 +486,7 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
self.assert_(compiled == fwd_sql or compiled == rev_sql,
"\n'" + compiled + "'\n does not match\n'" +
fwd_sql + "'\n or\n'" + rev_sql + "'")
-
+
def test_negated_null(self):
self._test(User.id == None, "users.id IS NULL")
self._test(~(User.id==None), "users.id IS NOT NULL")
@@ -496,7 +496,7 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
self._test(~(Address.user==None), "addresses.user_id IS NOT NULL")
self._test(None == Address.user, "addresses.user_id IS NULL")
self._test(~(None == Address.user), "addresses.user_id IS NOT NULL")
-
+
def test_relationship(self):
self._test(User.addresses.any(Address.id==17),
"EXISTS (SELECT 1 "
@@ -506,7 +506,7 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
u7 = User(id=7)
attributes.instance_state(u7).commit_all(attributes.instance_dict(u7))
-
+
self._test(Address.user == u7, ":param_1 = addresses.user_id")
self._test(Address.user != u7, "addresses.user_id != :user_id_1 OR addresses.user_id IS NULL")
@@ -530,7 +530,7 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
Node.children==None,
"NOT (EXISTS (SELECT 1 FROM nodes AS nodes_1 WHERE nodes.id = nodes_1.parent_id))"
)
-
+
self._test(
Node.parent==None,
"nodes.parent_id IS NULL"
@@ -545,12 +545,12 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
nalias.children==None,
"NOT (EXISTS (SELECT 1 FROM nodes WHERE nodes_1.id = nodes.parent_id))"
)
-
+
self._test(
nalias.children.any(Node.data=='some data'),
"EXISTS (SELECT 1 FROM nodes WHERE "
"nodes_1.id = nodes.parent_id AND nodes.data = :data_1)")
-
+
# fails, but I think I want this to fail
#self._test(
# Node.children.any(nalias.data=='some data'),
@@ -567,7 +567,7 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
Node.parent.has(Node.data=='some data'),
"EXISTS (SELECT 1 FROM nodes AS nodes_1 WHERE nodes_1.id = nodes.parent_id AND nodes_1.data = :data_1)"
)
-
+
self._test(
Node.parent == Node(id=7),
":param_1 = nodes.parent_id"
@@ -582,11 +582,11 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
nalias.parent != Node(id=7),
'nodes_1.parent_id != :parent_id_1 OR nodes_1.parent_id IS NULL'
)
-
+
self._test(
nalias.children.contains(Node(id=7)), "nodes_1.id = :param_1"
)
-
+
def test_op(self):
self._test(User.name.op('ilike')('17'), "users.name ilike :name_1")
@@ -596,11 +596,11 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
def test_in_on_relationship_not_supported(self):
assert_raises(NotImplementedError, Address.user.in_, [User(id=5)])
-
+
def test_neg(self):
self._test(-User.id, "-users.id")
self._test(User.id + -User.id, "users.id + -users.id")
-
+
def test_between(self):
self._test(User.id.between('a', 'b'),
"users.id BETWEEN :id_1 AND :id_2")
@@ -623,7 +623,7 @@ class OperatorTest(QueryTest, AssertsCompiledSQL):
class ExpressionTest(QueryTest, AssertsCompiledSQL):
-
+
def test_deferred_instances(self):
session = create_session()
s = session.query(User).filter(and_(addresses.c.email_address == bindparam('emailad'), Address.user_id==User.id)).statement
@@ -633,13 +633,13 @@ class ExpressionTest(QueryTest, AssertsCompiledSQL):
def test_scalar_subquery(self):
session = create_session()
-
+
q = session.query(User.id).filter(User.id==7).subquery()
-
+
q = session.query(User).filter(User.id==q)
-
+
eq_(User(id=7), q.one())
-
+
def test_label(self):
session = create_session()
@@ -649,29 +649,29 @@ class ExpressionTest(QueryTest, AssertsCompiledSQL):
"SELECT (SELECT users.id FROM users WHERE users.id = :id_1) AS foo",
use_default_dialect=True
)
-
+
def test_as_scalar(self):
session = create_session()
q = session.query(User.id).filter(User.id==7).as_scalar()
-
+
self.assert_compile(session.query(User).filter(User.id.in_(q)),
'SELECT users.id AS users_id, users.name '
'AS users_name FROM users WHERE users.id '
'IN (SELECT users.id FROM users WHERE '
'users.id = :id_1)',
use_default_dialect=True)
-
-
+
+
def test_param_transfer(self):
session = create_session()
-
+
q = session.query(User.id).filter(User.id==bindparam('foo')).params(foo=7).subquery()
-
+
q = session.query(User).filter(User.id==q)
-
+
eq_(User(id=7), q.one())
-
+
def test_in(self):
session = create_session()
s = session.query(User.id).join(User.addresses).group_by(User.id).having(func.count(Address.id) > 2)
@@ -682,17 +682,17 @@ class ExpressionTest(QueryTest, AssertsCompiledSQL):
def test_union(self):
s = create_session()
-
+
q1 = s.query(User).filter(User.name=='ed').with_labels()
q2 = s.query(User).filter(User.name=='fred').with_labels()
eq_(
s.query(User).from_statement(union(q1, q2).order_by('users_name')).all(),
[User(name='ed'), User(name='fred')]
)
-
+
def test_select(self):
s = create_session()
-
+
# this is actually not legal on most DBs since the subquery has no alias
q1 = s.query(User).filter(User.name=='ed')
@@ -703,7 +703,7 @@ class ExpressionTest(QueryTest, AssertsCompiledSQL):
"users.name AS users_name FROM users WHERE users.name = :name_1)",
dialect=default.DefaultDialect()
)
-
+
def test_join(self):
s = create_session()
@@ -715,7 +715,7 @@ class ExpressionTest(QueryTest, AssertsCompiledSQL):
s.query(User, adalias).join(adalias, User.id==adalias.user_id).all(),
[(User(id=7,name=u'jack'), Address(email_address=u'jack@bean.com',user_id=7,id=1))]
)
-
+
# more slice tests are available in test/orm/generative.py
class SliceTest(QueryTest):
def test_first(self):
@@ -726,15 +726,15 @@ class SliceTest(QueryTest):
@testing.only_on('sqlite', 'testing execution but db-specific syntax')
def test_limit_offset_applies(self):
"""Test that the expected LIMIT/OFFSET is applied for slices.
-
+
The LIMIT/OFFSET syntax differs slightly on all databases, and
query[x:y] executes immediately, so we are asserting against
SQL strings using sqlite's syntax.
-
+
"""
sess = create_session()
q = sess.query(User)
-
+
self.assert_sql(testing.db, lambda: q[10:20], [
("SELECT users.id AS users_id, users.name AS users_name FROM users LIMIT :param_1 OFFSET :param_2", {'param_1':10, 'param_2':10})
])
@@ -764,7 +764,7 @@ class SliceTest(QueryTest):
])
-
+
class FilterTest(QueryTest):
def test_basic(self):
assert [User(id=7), User(id=8), User(id=9),User(id=10)] == create_session().query(User).all()
@@ -776,20 +776,20 @@ class FilterTest(QueryTest):
assert [User(id=8), User(id=9)] == list(create_session().query(User).order_by(User.id)[1:3])
assert User(id=8) == create_session().query(User).order_by(User.id)[1]
-
+
assert [] == create_session().query(User).order_by(User.id)[3:3]
assert [] == create_session().query(User).order_by(User.id)[0:0]
-
+
@testing.requires.boolean_col_expressions
def test_exists(self):
sess = create_session(testing.db)
-
+
assert sess.query(exists().where(User.id==9)).scalar()
assert not sess.query(exists().where(User.id==29)).scalar()
-
+
def test_one_filter(self):
assert [User(id=8), User(id=9)] == create_session().query(User).filter(User.name.endswith('ed')).all()
-
+
def test_contains(self):
"""test comparing a collection to an object instance."""
@@ -824,15 +824,15 @@ class FilterTest(QueryTest):
filter(User.addresses.any(id=4)).all()
assert [User(id=9)] == sess.query(User).filter(User.addresses.any(email_address='fred@fred.com')).all()
-
+
# test that any() doesn't overcorrelate
assert [User(id=7), User(id=8)] == sess.query(User).join("addresses").filter(~User.addresses.any(Address.email_address=='fred@fred.com')).all()
-
+
# test that the contents are not adapted by the aliased join
assert [User(id=7), User(id=8)] == sess.query(User).join("addresses", aliased=True).filter(~User.addresses.any(Address.email_address=='fred@fred.com')).all()
assert [User(id=10)] == sess.query(User).outerjoin("addresses", aliased=True).filter(~User.addresses.any()).all()
-
+
@testing.crashes('maxdb', 'can dump core')
def test_has(self):
sess = create_session()
@@ -851,10 +851,10 @@ class FilterTest(QueryTest):
# test has() doesnt' get subquery contents adapted by aliased join
assert [Address(id=2), Address(id=3), Address(id=4)] == \
sess.query(Address).join("user", aliased=True).filter(Address.user.has(User.name.like('%ed%'), id=8)).order_by(Address.id).all()
-
+
dingaling = sess.query(Dingaling).get(2)
assert [User(id=9)] == sess.query(User).filter(User.addresses.any(Address.dingaling==dingaling)).all()
-
+
def test_contains_m2m(self):
sess = create_session()
item = sess.query(Item).get(3)
@@ -864,7 +864,7 @@ class FilterTest(QueryTest):
item2 = sess.query(Item).get(5)
assert [Order(id=3)] == sess.query(Order).filter(Order.items.contains(item)).filter(Order.items.contains(item2)).all()
-
+
def test_comparison(self):
"""test scalar comparison to an object instance"""
@@ -888,7 +888,7 @@ class FilterTest(QueryTest):
# m2m
eq_(sess.query(Item).filter(Item.keywords==None).order_by(Item.id).all(), [Item(id=4), Item(id=5)])
eq_(sess.query(Item).filter(Item.keywords!=None).order_by(Item.id).all(), [Item(id=1),Item(id=2), Item(id=3)])
-
+
def test_filter_by(self):
sess = create_session()
user = sess.query(User).get(8)
@@ -901,10 +901,10 @@ class FilterTest(QueryTest):
# one to many generates WHERE NOT EXISTS
assert [User(name='chuck')] == sess.query(User).filter_by(addresses = None).all()
assert [User(name='chuck')] == sess.query(User).filter_by(addresses = null()).all()
-
+
def test_none_comparison(self):
sess = create_session()
-
+
# scalar
eq_(
[Order(description="order 5")],
@@ -914,7 +914,7 @@ class FilterTest(QueryTest):
[Order(description="order 5")],
sess.query(Order).filter(Order.address_id==null()).all()
)
-
+
# o2o
eq_([Address(id=1), Address(id=3), Address(id=4)],
sess.query(Address).filter(Address.dingaling==None).order_by(Address.id).all())
@@ -922,11 +922,11 @@ class FilterTest(QueryTest):
sess.query(Address).filter(Address.dingaling==null()).order_by(Address.id).all())
eq_([Address(id=2), Address(id=5)], sess.query(Address).filter(Address.dingaling != None).order_by(Address.id).all())
eq_([Address(id=2), Address(id=5)], sess.query(Address).filter(Address.dingaling != null()).order_by(Address.id).all())
-
+
# m2o
eq_([Order(id=5)], sess.query(Order).filter(Order.address==None).all())
eq_([Order(id=1), Order(id=2), Order(id=3), Order(id=4)], sess.query(Order).order_by(Order.id).filter(Order.address!=None).all())
-
+
# o2m
eq_([User(id=10)], sess.query(User).filter(User.addresses==None).all())
eq_([User(id=7),User(id=8),User(id=9)], sess.query(User).filter(User.addresses!=None).order_by(User.id).all())
@@ -942,16 +942,16 @@ class FilterTest(QueryTest):
)
-
+
class SetOpsTest(QueryTest, AssertsCompiledSQL):
-
+
def test_union(self):
s = create_session()
-
+
fred = s.query(User).filter(User.name=='fred')
ed = s.query(User).filter(User.name=='ed')
jack = s.query(User).filter(User.name=='jack')
-
+
eq_(fred.union(ed).order_by(User.name).all(),
[User(name='ed'), User(name='fred')]
)
@@ -959,17 +959,17 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
eq_(fred.union(ed, jack).order_by(User.name).all(),
[User(name='ed'), User(name='fred'), User(name='jack')]
)
-
+
def test_statement_labels(self):
"""test that label conflicts don't occur with joins etc."""
-
+
s = create_session()
q1 = s.query(User, Address).join(User.addresses).\
filter(Address.email_address=="ed@wood.com")
q2 = s.query(User, Address).join(User.addresses).\
filter(Address.email_address=="jack@bean.com")
q3 = q1.union(q2).order_by(User.name)
-
+
eq_(
q3.all(),
[
@@ -977,11 +977,11 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
(User(name='jack'), Address(email_address="jack@bean.com")),
]
)
-
+
def test_union_literal_expressions_compile(self):
"""test that column expressions translate during
the _from_statement() portion of union(), others"""
-
+
s = Session()
q1 = s.query(User, literal("x"))
q2 = s.query(User, literal_column("'y'"))
@@ -1011,7 +1011,7 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
[x['name'] for x in q6.column_descriptions],
['User', 'foo']
)
-
+
for q in (q3.order_by(User.id, "anon_1_anon_2"), q6.order_by(User.id, "foo")):
eq_(q.all(),
[
@@ -1025,15 +1025,15 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
(User(id=10, name=u'chuck'), u'y')
]
)
-
+
def test_union_labeled_anonymous_columns(self):
s = Session()
-
+
c1, c2 = column('c1'), column('c2')
q1 = s.query(User, c1.label('foo'), c1.label('bar'))
q2 = s.query(User, c1.label('foo'), c2.label('bar'))
q3 = q1.union(q2)
-
+
eq_(
[x['name'] for x in q3.column_descriptions],
['User', 'foo', 'bar']
@@ -1050,12 +1050,12 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
"FROM users) AS anon_1",
use_default_dialect=True
)
-
+
def test_union_mapped_colnames_preserved_across_subquery(self):
s = Session()
q1 = s.query(User.name)
q2 = s.query(User.name)
-
+
# the label names in the subquery are the typical anonymized ones
self.assert_compile(
q1.union(q2),
@@ -1064,15 +1064,15 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
"UNION SELECT users.name AS users_name FROM users) AS anon_1",
use_default_dialect=True
)
-
+
# but in the returned named tuples,
# due to [ticket:1942], this should be 'name', not 'users_name'
eq_(
[x['name'] for x in q1.union(q2).column_descriptions],
['name']
)
-
-
+
+
@testing.fails_on('mysql', "mysql doesn't support intersect")
def test_intersect(self):
s = create_session()
@@ -1087,7 +1087,7 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
eq_(fred.union(ed).intersect(ed.union(jack)).all(),
[User(name='ed')]
)
-
+
def test_eager_load(self):
s = create_session()
@@ -1104,8 +1104,8 @@ class SetOpsTest(QueryTest, AssertsCompiledSQL):
]
)
self.assert_sql_count(testing.db, go, 1)
-
-
+
+
class AggregateTest(QueryTest):
def test_sum(self):
@@ -1127,7 +1127,7 @@ class AggregateTest(QueryTest):
class CountTest(QueryTest):
def test_basic(self):
s = create_session()
-
+
eq_(s.query(User).count(), 4)
eq_(s.query(User).filter(users.c.name.endswith('ed')).count(), 2)
@@ -1136,10 +1136,10 @@ class CountTest(QueryTest):
s = create_session()
q = s.query(User, Address)
eq_(q.count(), 20) # cartesian product
-
+
q = s.query(User, Address).join(User.addresses)
eq_(q.count(), 5)
-
+
def test_nested(self):
s = create_session()
q = s.query(User, Address).limit(2)
@@ -1150,12 +1150,12 @@ class CountTest(QueryTest):
q = s.query(User, Address).join(User.addresses).limit(100)
eq_(q.count(), 5)
-
+
def test_cols(self):
"""test that column-based queries always nest."""
-
+
s = create_session()
-
+
q = s.query(func.count(distinct(User.name)))
eq_(q.count(), 1)
@@ -1171,8 +1171,8 @@ class CountTest(QueryTest):
q = s.query(Address.user_id)
eq_(q.count(), 5)
eq_(q.distinct().count(), 3)
-
-
+
+
class DistinctTest(QueryTest):
def test_basic(self):
eq_(
@@ -1232,9 +1232,9 @@ class HintsTest(QueryTest, AssertsCompiledSQL):
def test_hints(self):
from sqlalchemy.dialects import mysql
dialect = mysql.dialect()
-
+
sess = create_session()
-
+
self.assert_compile(
sess.query(User).with_hint(User, 'USE INDEX (col1_index,col2_index)'),
"SELECT users.id AS users_id, users.name AS users_name "
@@ -1248,7 +1248,7 @@ class HintsTest(QueryTest, AssertsCompiledSQL):
"FROM users",
dialect=dialect
)
-
+
ualias = aliased(User)
self.assert_compile(
sess.query(User, ualias).with_hint(ualias, 'USE INDEX (col1_index,col2_index)').
@@ -1259,7 +1259,7 @@ class HintsTest(QueryTest, AssertsCompiledSQL):
"ON users.id < users_1.id",
dialect=dialect
)
-
+
class TextTest(QueryTest):
def test_fulltext(self):
@@ -1304,7 +1304,7 @@ class ParentTest(QueryTest):
o = sess.query(Order).filter(with_parent(u1, User.orders)).all()
assert [Order(description="order 1"), Order(description="order 3"), Order(description="order 5")] == o
-
+
# test generative criterion
o = sess.query(Order).with_parent(u1).filter(orders.c.id>2).all()
assert [Order(description="order 3"), Order(description="order 5")] == o
@@ -1335,7 +1335,7 @@ class ParentTest(QueryTest):
def test_with_transient(self):
sess = Session()
-
+
q = sess.query(User)
u1 = q.filter_by(name='jack').one()
utrans = User(id=u1.id)
@@ -1350,7 +1350,7 @@ class ParentTest(QueryTest):
[Order(description="order 1"), Order(description="order 3"), Order(description="order 5")],
o.all()
)
-
+
def test_with_pending_autoflush(self):
sess = Session()
@@ -1376,9 +1376,9 @@ class ParentTest(QueryTest):
sess.query(User).with_parent(opending, 'user').one(),
User(id=o1.user_id)
)
-
-
+
+
class SynonymTest(QueryTest):
@@ -1499,7 +1499,7 @@ class ImmediateTest(_fixtures.FixtureTest):
filter(User.id.in_([8, 9])).
order_by(User.id).
one)
-
+
@testing.future
def test_getslice(self):
@@ -1514,10 +1514,10 @@ class ImmediateTest(_fixtures.FixtureTest):
eq_(sess.query(User.id).filter_by(id=0).scalar(), None)
eq_(sess.query(User).filter_by(id=7).scalar(),
sess.query(User).filter_by(id=7).one())
-
+
assert_raises(sa.orm.exc.MultipleResultsFound, sess.query(User).scalar)
assert_raises(sa.orm.exc.MultipleResultsFound, sess.query(User.id, User.name).scalar)
-
+
@testing.resolve_artifact_names
def test_value(self):
sess = create_session()
@@ -1580,7 +1580,7 @@ class UpdateDeleteTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_illegal_operations(self):
s = create_session()
-
+
for q, mname in (
(s.query(User).limit(2), "limit"),
(s.query(User).offset(2), "offset"),
@@ -1591,17 +1591,17 @@ class UpdateDeleteTest(_base.MappedTest):
):
assert_raises_message(sa_exc.InvalidRequestError, r"Can't call Query.update\(\) when %s\(\) has been called" % mname, q.update, {'name':'ed'})
assert_raises_message(sa_exc.InvalidRequestError, r"Can't call Query.delete\(\) when %s\(\) has been called" % mname, q.delete)
-
-
+
+
@testing.resolve_artifact_names
def test_delete(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
sess.query(User).filter(or_(User.name == 'john', User.name == 'jill')).delete()
-
+
assert john not in sess and jill not in sess
-
+
eq_(sess.query(User).order_by(User.id).all(), [jack,jane])
@testing.resolve_artifact_names
@@ -1631,53 +1631,53 @@ class UpdateDeleteTest(_base.MappedTest):
assert john not in sess and jill not in sess
sess.rollback()
assert john in sess and jill in sess
-
+
@testing.resolve_artifact_names
def test_delete_without_session_sync(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
sess.query(User).filter(or_(User.name == 'john', User.name == 'jill')).delete(synchronize_session=False)
-
+
assert john in sess and jill in sess
-
+
eq_(sess.query(User).order_by(User.id).all(), [jack,jane])
@testing.resolve_artifact_names
def test_delete_with_fetch_strategy(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
sess.query(User).filter(or_(User.name == 'john', User.name == 'jill')).delete(synchronize_session='fetch')
-
+
assert john not in sess and jill not in sess
-
+
eq_(sess.query(User).order_by(User.id).all(), [jack,jane])
@testing.fails_on('mysql', 'FIXME: unknown')
@testing.resolve_artifact_names
def test_delete_invalid_evaluation(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
-
+
assert_raises(sa_exc.InvalidRequestError,
sess.query(User).filter(User.name == select([func.max(User.name)])).delete, synchronize_session='evaluate'
)
-
+
sess.query(User).filter(User.name == select([func.max(User.name)])).delete(synchronize_session='fetch')
-
+
assert john not in sess
-
+
eq_(sess.query(User).order_by(User.id).all(), [jack,jill,jane])
@testing.resolve_artifact_names
def test_update(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
sess.query(User).filter(User.age > 29).update({'age': User.age - 10}, synchronize_session='evaluate')
-
+
eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27])
eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27]))
@@ -1702,7 +1702,7 @@ class UpdateDeleteTest(_base.MappedTest):
)
class Data(_base.ComparableEntity):
pass
-
+
mapper(Data, data, properties={'cnt':data.c.counter})
metadata.create_all()
d1 = Data()
@@ -1713,12 +1713,12 @@ class UpdateDeleteTest(_base.MappedTest):
sess.query(Data).update({Data.cnt:Data.cnt + 1})
sess.flush()
-
+
eq_(d1.cnt, 1)
sess.query(Data).update({Data.cnt:Data.cnt + 1}, 'fetch')
sess.flush()
-
+
eq_(d1.cnt, 2)
sess.close()
@@ -1738,19 +1738,19 @@ class UpdateDeleteTest(_base.MappedTest):
sess = create_session(bind=testing.db, autocommit=False, autoflush=False)
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
-
+
john.age = 50
jack.age = 37
-
+
# autoflush is false. therefore our '50' and '37' are getting blown away by this operation.
-
+
sess.query(User).filter(User.age > 29).update({'age': User.age - 10}, synchronize_session='evaluate')
for x in (john, jack, jill, jane):
assert not sess.is_modified(x)
eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27])
-
+
john.age = 25
assert john in sess.dirty
assert jack in sess.dirty
@@ -1780,16 +1780,16 @@ class UpdateDeleteTest(_base.MappedTest):
assert jill not in sess.dirty
assert sess.is_modified(john)
assert not sess.is_modified(jack)
-
-
+
+
@testing.resolve_artifact_names
def test_update_with_expire_strategy(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
sess.query(User).filter(User.age > 29).update({'age': User.age - 10}, synchronize_session='fetch')
-
+
eq_([john.age, jack.age, jill.age, jane.age], [25,37,29,27])
eq_(sess.query(User.age).order_by(User.id).all(), zip([25,37,29,27]))
@@ -1847,23 +1847,23 @@ class UpdateDeleteTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_update_all(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
sess.query(User).update({'age': 42}, synchronize_session='evaluate')
-
+
eq_([john.age, jack.age, jill.age, jane.age], [42,42,42,42])
eq_(sess.query(User.age).order_by(User.id).all(), zip([42,42,42,42]))
@testing.resolve_artifact_names
def test_delete_all(self):
sess = create_session(bind=testing.db, autocommit=False)
-
+
john,jack,jill,jane = sess.query(User).order_by(User.id).all()
sess.query(User).delete(synchronize_session='evaluate')
-
+
assert not (john in sess or jack in sess or jill in sess or jane in sess)
eq_(sess.query(User).count(), 0)
-
+
class StatementOptionsTest(QueryTest):
@@ -1892,13 +1892,13 @@ class StatementOptionsTest(QueryTest):
class OptionsTest(QueryTest):
"""Test the _get_paths() method of PropertyOption."""
-
+
def _option_fixture(self, *arg):
from sqlalchemy.orm import interfaces
class Opt(interfaces.PropertyOption):
pass
return Opt(arg)
-
+
def _make_path(self, path):
r = []
for i, item in enumerate(path):
@@ -1907,39 +1907,39 @@ class OptionsTest(QueryTest):
item = class_mapper(item)
r.append(item)
return tuple(r)
-
+
def _assert_path_result(self, opt, q, paths, mappers):
eq_(
opt._get_paths(q, False),
([self._make_path(p) for p in paths],
[class_mapper(c) for c in mappers])
)
-
+
def test_get_path_one_level_string(self):
sess = Session()
q = sess.query(User)
-
+
opt = self._option_fixture("addresses")
self._assert_path_result(opt, q, [(User, 'addresses')], [User])
def test_get_path_one_level_attribute(self):
sess = Session()
q = sess.query(User)
-
+
opt = self._option_fixture(User.addresses)
self._assert_path_result(opt, q, [(User, 'addresses')], [User])
def test_get_path_one_level_with_unrelated(self):
sess = Session()
q = sess.query(Order)
-
+
opt = self._option_fixture("addresses")
self._assert_path_result(opt, q, [], [])
def test_path_multilevel_string(self):
sess = Session()
q = sess.query(User)
-
+
opt = self._option_fixture("orders.items.keywords")
self._assert_path_result(opt, q, [
(User, 'orders'),
@@ -1951,7 +1951,7 @@ class OptionsTest(QueryTest):
def test_path_multilevel_attribute(self):
sess = Session()
q = sess.query(User)
-
+
opt = self._option_fixture(User.orders, Order.items, Item.keywords)
self._assert_path_result(opt, q, [
(User, 'orders'),
@@ -2013,10 +2013,10 @@ class OptionsTest(QueryTest):
mapper(SubAddr, inherits=Address, properties={
'flub':relationship(Dingaling)
})
-
+
q = sess.query(Address)
opt = self._option_fixture(SubAddr.flub)
-
+
self._assert_path_result(opt, q, [(Address, 'flub')], [SubAddr])
def test_from_subclass_to_subclass_attr(self):
@@ -2026,10 +2026,10 @@ class OptionsTest(QueryTest):
mapper(SubAddr, inherits=Address, properties={
'flub':relationship(Dingaling)
})
-
+
q = sess.query(SubAddr)
opt = self._option_fixture(SubAddr.flub)
-
+
self._assert_path_result(opt, q, [(SubAddr, 'flub')], [SubAddr])
def test_from_base_to_base_attr_via_subclass(self):
@@ -2039,10 +2039,10 @@ class OptionsTest(QueryTest):
mapper(SubAddr, inherits=Address, properties={
'flub':relationship(Dingaling)
})
-
+
q = sess.query(Address)
opt = self._option_fixture(SubAddr.user)
-
+
self._assert_path_result(opt, q, [(Address, 'user')], [Address])
def test_of_type(self):
@@ -2050,10 +2050,10 @@ class OptionsTest(QueryTest):
class SubAddr(Address):
pass
mapper(SubAddr, inherits=Address)
-
+
q = sess.query(User)
opt = self._option_fixture(User.addresses.of_type(SubAddr), SubAddr.user)
-
+
self._assert_path_result(opt, q, [
(User, 'addresses'),
(User, 'addresses', SubAddr, 'user')
@@ -2066,15 +2066,15 @@ class OptionsTest(QueryTest):
mapper(SubAddr, inherits=Address, properties={
'flub':relationship(Dingaling)
})
-
+
q = sess.query(User)
opt = self._option_fixture(User.addresses.of_type(SubAddr), SubAddr.flub)
-
+
self._assert_path_result(opt, q, [
(User, 'addresses'),
(User, 'addresses', SubAddr, 'flub')
], [User, SubAddr])
-
+
def test_aliased_single(self):
sess = Session()
ualias = aliased(User)
@@ -2109,4 +2109,4 @@ class OptionsTest(QueryTest):
)
opt = self._option_fixture(Address.user, User.addresses)
self._assert_path_result(opt, q, [], [])
-
+
diff --git a/test/orm/test_relationships.py b/test/orm/test_relationships.py
index 39480d79f..feb5c8503 100644
--- a/test/orm/test_relationships.py
+++ b/test/orm/test_relationships.py
@@ -103,22 +103,22 @@ class CompositeSelfRefFKTest(_base.MappedTest):
"""Tests a composite FK where, in
the relationship(), one col points
to itself in the same table.
-
+
this is a very unusual case::
-
+
company employee
---------- ----------
company_id <--- company_id ------+
name ^ |
+------------+
-
+
emp_id <---------+
name |
reports_to_id ---+
-
+
employee joins to its sub-employees
both on reports_to_id, *and on company_id to itself*.
-
+
"""
@classmethod
@@ -151,7 +151,7 @@ class CompositeSelfRefFKTest(_base.MappedTest):
self.company = company
self.emp_id = emp_id
self.reports_to = reports_to
-
+
@testing.resolve_artifact_names
def test_explicit(self):
mapper(Company, company_t)
@@ -198,7 +198,7 @@ class CompositeSelfRefFKTest(_base.MappedTest):
})
self._test()
-
+
@testing.resolve_artifact_names
def test_very_explicit(self):
mapper(Company, company_t)
@@ -215,7 +215,7 @@ class CompositeSelfRefFKTest(_base.MappedTest):
})
self._test()
-
+
@testing.resolve_artifact_names
def _test(self):
sess = create_session()
@@ -398,7 +398,7 @@ class FKsAsPksTest(_base.MappedTest):
test_needs_autoincrement=True),
Column("foo",Integer,),
test_needs_fk=True)
-
+
Table("tableB",metadata,
Column("id",Integer,ForeignKey("tableA.id"),primary_key=True),
test_needs_fk=True)
@@ -415,16 +415,16 @@ class FKsAsPksTest(_base.MappedTest):
def test_onetoone_switch(self):
"""test that active history is enabled on a
one-to-many/one that has use_get==True"""
-
+
mapper(A, tableA, properties={
'b':relationship(B, cascade="all,delete-orphan", uselist=False)})
mapper(B, tableB)
-
+
configure_mappers()
assert A.b.property.strategy.use_get
-
+
sess = create_session()
-
+
a1 = A()
sess.add(a1)
sess.flush()
@@ -432,7 +432,7 @@ class FKsAsPksTest(_base.MappedTest):
a1 = sess.query(A).first()
a1.b = B()
sess.flush()
-
+
@testing.resolve_artifact_names
def test_no_delete_PK_AtoB(self):
"""A cant be deleted without B because B would have no PK value."""
@@ -531,7 +531,7 @@ class FKsAsPksTest(_base.MappedTest):
def test_delete_cascade_AtoB(self):
"""No 'blank the PK' error when the child is to
be deleted as part of a cascade"""
-
+
for cascade in ("save-update, delete",
#"save-update, delete-orphan",
"save-update, delete, delete-orphan"):
@@ -597,7 +597,7 @@ class FKsAsPksTest(_base.MappedTest):
class UniqueColReferenceSwitchTest(_base.MappedTest):
"""test a relationship based on a primary
join against a unique non-pk column"""
-
+
@classmethod
def define_tables(cls, metadata):
Table("table_a", metadata,
@@ -614,7 +614,7 @@ class UniqueColReferenceSwitchTest(_base.MappedTest):
ForeignKey('table_a.ident'),
nullable=False),
)
-
+
@classmethod
def setup_classes(cls):
class A(_base.ComparableEntity):
@@ -641,7 +641,7 @@ class UniqueColReferenceSwitchTest(_base.MappedTest):
b.a = a2
session.delete(a1)
session.flush()
-
+
class RelationshipToSelectableTest(_base.MappedTest):
"""Test a map to a select that relates to a map to the table."""
@@ -712,9 +712,9 @@ class FKEquatedToConstantTest(_base.MappedTest):
"""test a relationship with a non-column entity in the primary join,
is not viewonly, and also has the non-column's clause mentioned in the
foreign keys list.
-
+
"""
-
+
@classmethod
def define_tables(cls, metadata):
Table('tags', metadata, Column("id", Integer, primary_key=True,
@@ -753,13 +753,13 @@ class FKEquatedToConstantTest(_base.MappedTest):
sess.add(t1)
sess.flush()
sess.expunge_all()
-
+
# relationship works
eq_(
sess.query(Tag).all(),
[Tag(data='some tag', foo=[TagInstance(data='iplc_case')])]
)
-
+
# both TagInstances were persisted
eq_(
sess.query(TagInstance).order_by(TagInstance.data).all(),
@@ -767,7 +767,7 @@ class FKEquatedToConstantTest(_base.MappedTest):
)
class BackrefPropagatesForwardsArgs(_base.MappedTest):
-
+
@classmethod
def define_tables(cls, metadata):
Table('users', metadata,
@@ -781,17 +781,17 @@ class BackrefPropagatesForwardsArgs(_base.MappedTest):
Column('user_id', Integer),
Column('email', String(50))
)
-
+
@classmethod
def setup_classes(cls):
class User(_base.ComparableEntity):
pass
class Address(_base.ComparableEntity):
pass
-
+
@testing.resolve_artifact_names
def test_backref(self):
-
+
mapper(User, users, properties={
'addresses':relationship(Address,
primaryjoin=addresses.c.user_id==users.c.id,
@@ -799,7 +799,7 @@ class BackrefPropagatesForwardsArgs(_base.MappedTest):
backref='user')
})
mapper(Address, addresses)
-
+
sess = sessionmaker()()
u1 = User(name='u1', addresses=[Address(email='a1')])
sess.add(u1)
@@ -807,18 +807,18 @@ class BackrefPropagatesForwardsArgs(_base.MappedTest):
eq_(sess.query(Address).all(), [
Address(email='a1', user=User(name='u1'))
])
-
+
class AmbiguousJoinInterpretedAsSelfRef(_base.MappedTest):
"""test ambiguous joins due to FKs on both sides treated as
self-referential.
-
+
this mapping is very similar to that of
test/orm/inheritance/query.py
SelfReferentialTestJoinedToBase , except that inheritance is
not used here.
-
+
"""
-
+
@classmethod
def define_tables(cls, metadata):
subscriber_table = Table('subscriber', metadata,
@@ -854,14 +854,14 @@ class AmbiguousJoinInterpretedAsSelfRef(_base.MappedTest):
'addresses' : relationship(Address,
backref=backref("customer"))
})
-
+
@testing.resolve_artifact_names
def test_mapping(self):
from sqlalchemy.orm.interfaces import ONETOMANY, MANYTOONE
sess = create_session()
assert Subscriber.addresses.property.direction is ONETOMANY
assert Address.customer.property.direction is MANYTOONE
-
+
s1 = Subscriber(type='A',
addresses = [
Address(type='D'),
@@ -869,15 +869,15 @@ class AmbiguousJoinInterpretedAsSelfRef(_base.MappedTest):
]
)
a1 = Address(type='B', customer=Subscriber(type='C'))
-
+
assert s1.addresses[0].customer is s1
assert a1.customer.addresses[0] is a1
-
+
sess.add_all([s1, a1])
-
+
sess.flush()
sess.expunge_all()
-
+
eq_(
sess.query(Subscriber).order_by(Subscriber.type).all(),
[
@@ -892,24 +892,24 @@ class ManualBackrefTest(_fixtures.FixtureTest):
"""Test explicit relationships that are backrefs to each other."""
run_inserts = None
-
+
@testing.resolve_artifact_names
def test_o2m(self):
mapper(User, users, properties={
'addresses':relationship(Address, back_populates='user')
})
-
+
mapper(Address, addresses, properties={
'user':relationship(User, back_populates='addresses')
})
-
+
sess = create_session()
-
+
u1 = User(name='u1')
a1 = Address(email_address='foo')
u1.addresses.append(a1)
assert a1.user is u1
-
+
sess.add(u1)
sess.flush()
sess.expire_all()
@@ -922,33 +922,33 @@ class ManualBackrefTest(_fixtures.FixtureTest):
mapper(User, users, properties={
'addresses':relationship(Address, back_populates='userr')
})
-
+
mapper(Address, addresses, properties={
'user':relationship(User, back_populates='addresses')
})
-
+
assert_raises(sa.exc.InvalidRequestError, configure_mappers)
-
+
@testing.resolve_artifact_names
def test_invalid_target(self):
mapper(User, users, properties={
'addresses':relationship(Address, back_populates='dingaling'),
})
-
+
mapper(Dingaling, dingalings)
mapper(Address, addresses, properties={
'dingaling':relationship(Dingaling)
})
-
+
assert_raises_message(sa.exc.ArgumentError,
r"reverse_property 'dingaling' on relationship "
"User.addresses references "
"relationship Address.dingaling, which does not "
"reference mapper Mapper\|User\|users",
configure_mappers)
-
+
class JoinConditionErrorTest(testing.TestBase):
-
+
def test_clauseelement_pj(self):
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
@@ -960,7 +960,7 @@ class JoinConditionErrorTest(testing.TestBase):
id = Column('id', Integer, primary_key=True)
c1id = Column('c1id', Integer, ForeignKey('c1.id'))
c2 = relationship(C1, primaryjoin=C1.id)
-
+
assert_raises(sa.exc.ArgumentError, configure_mappers)
def test_clauseelement_pj_false(self):
@@ -976,7 +976,7 @@ class JoinConditionErrorTest(testing.TestBase):
c2 = relationship(C1, primaryjoin="x"=="y")
assert_raises(sa.exc.ArgumentError, configure_mappers)
-
+
def test_only_column_elements(self):
m = MetaData()
t1 = Table('t1', m,
@@ -991,15 +991,15 @@ class JoinConditionErrorTest(testing.TestBase):
class C2(object):
pass
- mapper(C1, t1, properties={'c2':relationship(C2,
+ mapper(C1, t1, properties={'c2':relationship(C2,
primaryjoin=t1.join(t2))})
mapper(C2, t2)
assert_raises(sa.exc.ArgumentError, configure_mappers)
-
+
def test_invalid_string_args(self):
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import util
-
+
for argname, arg in [
('remote_side', ['c1.id']),
('remote_side', ['id']),
@@ -1013,21 +1013,21 @@ class JoinConditionErrorTest(testing.TestBase):
class C1(Base):
__tablename__ = 'c1'
id = Column('id', Integer, primary_key=True)
-
+
class C2(Base):
__tablename__ = 'c2'
id_ = Column('id', Integer, primary_key=True)
c1id = Column('c1id', Integer, ForeignKey('c1.id'))
c2 = relationship(C1, **kw)
-
+
assert_raises_message(
sa.exc.ArgumentError,
"Column-based expression object expected "
"for argument '%s'; got: '%s', type %r" %
(argname, arg[0], type(arg[0])),
configure_mappers)
-
-
+
+
def test_fk_error_raised(self):
m = MetaData()
t1 = Table('t1', m,
@@ -1042,17 +1042,17 @@ class JoinConditionErrorTest(testing.TestBase):
Column('id', Integer, primary_key=True),
Column('t1id', Integer, ForeignKey('t1.id'))
)
-
+
class C1(object):
pass
class C2(object):
pass
-
+
mapper(C1, t1, properties={'c2':relationship(C2)})
mapper(C2, t3)
-
+
assert_raises(sa.exc.NoReferencedColumnError, configure_mappers)
-
+
def test_join_error_raised(self):
m = MetaData()
t1 = Table('t1', m,
@@ -1076,10 +1076,10 @@ class JoinConditionErrorTest(testing.TestBase):
mapper(C2, t3)
assert_raises(sa.exc.ArgumentError, configure_mappers)
-
+
def teardown(self):
- clear_mappers()
-
+ clear_mappers()
+
class TypeMatchTest(_base.MappedTest):
"""test errors raised when trying to add items
whose type is not handled by a relationship"""
@@ -1273,18 +1273,18 @@ class ViewOnlyM2MBackrefTest(_base.MappedTest):
Column('t1id', Integer, ForeignKey('t1.id'), primary_key=True),
Column('t2id', Integer, ForeignKey('t2.id'), primary_key=True),
)
-
+
@testing.resolve_artifact_names
def test_viewonly(self):
class A(_base.ComparableEntity):pass
class B(_base.ComparableEntity):pass
-
+
mapper(A, t1, properties={
'bs':relationship(B, secondary=t1t2,
backref=backref('as_', viewonly=True))
})
mapper(B, t2)
-
+
sess = create_session()
a1 = A()
b1 = B(as_=[a1])
@@ -1297,7 +1297,7 @@ class ViewOnlyM2MBackrefTest(_base.MappedTest):
eq_(
sess.query(B).first(), B(as_=[A(id=a1.id)])
)
-
+
class ViewOnlyOverlappingNames(_base.MappedTest):
"""'viewonly' mappings with overlapping PK column names."""
@@ -1425,10 +1425,10 @@ class ViewOnlyUniqueNames(_base.MappedTest):
class ViewOnlyLocalRemoteM2M(testing.TestBase):
"""test that local-remote is correctly determined for m2m"""
-
+
def test_local_remote(self):
meta = MetaData()
-
+
t1 = Table('t1', meta,
Column('id', Integer, primary_key=True),
)
@@ -1439,7 +1439,7 @@ class ViewOnlyLocalRemoteM2M(testing.TestBase):
Column('t1_id', Integer, ForeignKey('t1.id',)),
Column('t2_id', Integer, ForeignKey('t2.id',)),
)
-
+
class A(object): pass
class B(object): pass
mapper( B, t2, )
@@ -1453,8 +1453,8 @@ class ViewOnlyLocalRemoteM2M(testing.TestBase):
m.get_property('b_plain').local_remote_pairs == \
[(t1.c.id, t12.c.t1_id), (t2.c.id, t12.c.t2_id)]
-
-
+
+
class ViewOnlyNonEquijoin(_base.MappedTest):
"""'viewonly' mappings based on non-equijoins."""
@@ -1878,7 +1878,7 @@ class InvalidRemoteSideTest(_base.MappedTest):
"mean to set remote_side on the many-to-one side ?",
configure_mappers)
-
+
class InvalidRelationshipEscalationTest(_base.MappedTest):
@classmethod
@@ -2041,8 +2041,8 @@ class InvalidRelationshipEscalationTest(_base.MappedTest):
sa.exc.ArgumentError,
"could not determine any local/remote column pairs",
sa.orm.configure_mappers)
-
-
+
+
@testing.resolve_artifact_names
def test_no_equated_self_ref(self):
mapper(Foo, foos, properties={
@@ -2093,7 +2093,7 @@ class InvalidRelationshipEscalationTest(_base.MappedTest):
viewonly=True)})
mapper(Bar, bars_with_fks)
sa.orm.configure_mappers()
-
+
@testing.resolve_artifact_names
def test_no_equated_self_ref_viewonly(self):
mapper(Foo, foos, properties={
@@ -2111,7 +2111,7 @@ class InvalidRelationshipEscalationTest(_base.MappedTest):
"present, or are otherwise part of a "
"ForeignKeyConstraint on their parent "
"Table.", sa.orm.configure_mappers)
-
+
sa.orm.clear_mappers()
mapper(Foo, foos_with_fks, properties={
'foos':relationship(Foo,
@@ -2162,7 +2162,7 @@ class InvalidRelationshipEscalationTest(_base.MappedTest):
"Could not determine relationship direction for primaryjoin "
"condition",
configure_mappers)
-
+
@testing.resolve_artifact_names
def test_equated_self_ref_wrong_fks(self):
@@ -2243,7 +2243,7 @@ class InvalidRelationshipEscalationTestM2M(_base.MappedTest):
primaryjoin=foos.c.id==foobars.c.fid,
secondaryjoin=foobars.c.bid==bars.c.id)})
mapper(Bar, bars)
-
+
assert_raises_message(sa.exc.SAWarning,
"No ForeignKey objects were present in "
"secondary table 'foobars'. Assumed "
@@ -2252,7 +2252,7 @@ class InvalidRelationshipEscalationTestM2M(_base.MappedTest):
"condition 'foos.id = foobars.fid' on "
"relationship Foo.bars",
sa.orm.configure_mappers)
-
+
sa.orm.clear_mappers()
mapper(Foo, foos, properties={
'bars': relationship(Bar,
@@ -2314,8 +2314,8 @@ class InvalidRelationshipEscalationTestM2M(_base.MappedTest):
Foo.bars.property.secondary_synchronize_pairs,
[(bars.c.id, foobars_with_many_columns.c.bid)]
)
-
-
+
+
@testing.resolve_artifact_names
def test_bad_primaryjoin(self):
mapper(Foo, foos, properties={
@@ -2330,7 +2330,7 @@ class InvalidRelationshipEscalationTestM2M(_base.MappedTest):
"Could not determine relationship direction for "
"primaryjoin condition",
configure_mappers)
-
+
sa.orm.clear_mappers()
mapper(Foo, foos, properties={
'bars': relationship(Bar,
@@ -2360,7 +2360,7 @@ class InvalidRelationshipEscalationTestM2M(_base.MappedTest):
viewonly=True)})
mapper(Bar, bars)
sa.orm.configure_mappers()
-
+
@testing.resolve_artifact_names
def test_bad_secondaryjoin(self):
mapper(Foo, foos, properties={
@@ -2404,22 +2404,22 @@ class InvalidRelationshipEscalationTestM2M(_base.MappedTest):
class ActiveHistoryFlagTest(_fixtures.FixtureTest):
run_inserts = None
run_deletes = None
-
+
def _test_attribute(self, obj, attrname, newvalue):
sess = Session()
sess.add(obj)
oldvalue = getattr(obj, attrname)
sess.commit()
-
+
# expired
assert attrname not in obj.__dict__
-
+
setattr(obj, attrname, newvalue)
eq_(
attributes.get_history(obj, attrname),
([newvalue,], (), [oldvalue,])
)
-
+
@testing.resolve_artifact_names
def test_column_property_flag(self):
mapper(User, users, properties={
@@ -2439,7 +2439,7 @@ class ActiveHistoryFlagTest(_fixtures.FixtureTest):
u2 = User(name='ed')
a1 = Address(email_address='a1', user=u1)
self._test_attribute(a1, 'user', u2)
-
+
@testing.resolve_artifact_names
def test_composite_property_flag(self):
class MyComposite(object):
@@ -2460,12 +2460,12 @@ class ActiveHistoryFlagTest(_fixtures.FixtureTest):
})
o1 = Order(composite=MyComposite('foo', 1))
self._test_attribute(o1, "composite", MyComposite('bar', 1))
-
-
+
+
class RelationDeprecationTest(_base.MappedTest):
"""test usage of the old 'relation' function."""
-
+
run_inserts = 'once'
run_deletes = None
diff --git a/test/orm/test_scoping.py b/test/orm/test_scoping.py
index 43472eae3..2ea1960f1 100644
--- a/test/orm/test_scoping.py
+++ b/test/orm/test_scoping.py
@@ -78,7 +78,7 @@ class ScopedSessionTest(_base.MappedTest):
def test_config_errors(self):
Session = scoped_session(sa.orm.sessionmaker())
-
+
s = Session()
assert_raises_message(
sa.exc.InvalidRequestError,
@@ -91,6 +91,6 @@ class ScopedSessionTest(_base.MappedTest):
"At least one scoped session is already present. ",
Session.configure, bind=testing.db
)
-
+
diff --git a/test/orm/test_selectable.py b/test/orm/test_selectable.py
index 54d0980a0..d1cf29751 100644
--- a/test/orm/test_selectable.py
+++ b/test/orm/test_selectable.py
@@ -46,12 +46,12 @@ class SelectableNoFromsTest(_base.MappedTest, AssertsCompiledSQL):
"could not assemble any primary key columns",
mapper, Subset, selectable
)
-
+
@testing.resolve_artifact_names
def test_no_selects(self):
subset_select = select([common.c.id, common.c.data])
assert_raises(sa.exc.InvalidRequestError, mapper, Subset, subset_select)
-
+
@testing.resolve_artifact_names
def test_basic(self):
subset_select = select([common.c.id, common.c.data]).alias()
diff --git a/test/orm/test_session.py b/test/orm/test_session.py
index d8b9b073a..ab0251368 100644
--- a/test/orm/test_session.py
+++ b/test/orm/test_session.py
@@ -78,7 +78,7 @@ class SessionTest(_fixtures.FixtureTest):
object_session,
User()
)
-
+
@testing.requires.sequences
def test_sequence_execute(self):
seq = Sequence("some_sequence")
@@ -88,8 +88,8 @@ class SessionTest(_fixtures.FixtureTest):
eq_(sess.execute(seq), 1)
finally:
seq.drop(testing.db)
-
-
+
+
@testing.resolve_artifact_names
def test_expunge_cascade(self):
mapper(Address, addresses)
@@ -152,7 +152,7 @@ class SessionTest(_fixtures.FixtureTest):
sess.execute(users_unbound.delete())
eq_(sess.execute(users_unbound.select()).fetchall(), [])
-
+
sess.close()
@engines.close_open_connections
@@ -256,7 +256,7 @@ class SessionTest(_fixtures.FixtureTest):
sess = create_session()
sess.add(User(name='test'))
sess.flush()
-
+
u1 = sess.query(User).first()
make_transient(u1)
assert u1 not in sess
@@ -268,7 +268,7 @@ class SessionTest(_fixtures.FixtureTest):
make_transient(u1)
sess.add(u1)
assert u1 in sess.new
-
+
# test expired attributes
# get unexpired
u1 = sess.query(User).first()
@@ -279,9 +279,9 @@ class SessionTest(_fixtures.FixtureTest):
# works twice
make_transient(u1)
-
+
sess.close()
-
+
u1.name = 'test2'
sess.add(u1)
sess.flush()
@@ -289,7 +289,7 @@ class SessionTest(_fixtures.FixtureTest):
sess.delete(u1)
sess.flush()
assert u1 not in sess
-
+
assert_raises(sa.exc.InvalidRequestError, sess.add, u1)
make_transient(u1)
sess.add(u1)
@@ -299,37 +299,37 @@ class SessionTest(_fixtures.FixtureTest):
@testing.resolve_artifact_names
def test_deleted_flag(self):
mapper(User, users)
-
+
sess = sessionmaker()()
-
+
u1 = User(name='u1')
sess.add(u1)
sess.commit()
-
+
sess.delete(u1)
sess.flush()
assert u1 not in sess
assert_raises(sa.exc.InvalidRequestError, sess.add, u1)
sess.rollback()
assert u1 in sess
-
+
sess.delete(u1)
sess.commit()
assert u1 not in sess
assert_raises(sa.exc.InvalidRequestError, sess.add, u1)
-
+
make_transient(u1)
sess.add(u1)
sess.commit()
-
+
eq_(sess.query(User).count(), 1)
-
+
@testing.resolve_artifact_names
def test_autoflush_expressions(self):
"""test that an expression which is dependent on object state is
evaluated after the session autoflushes. This is the lambda
inside of strategies.py lazy_clause.
-
+
"""
mapper(User, users, properties={
'addresses':relationship(Address, backref="user")})
@@ -419,7 +419,7 @@ class SessionTest(_fixtures.FixtureTest):
assert newad not in u.addresses
# pending objects dont get expired
assert newad.email_address == 'a new address'
-
+
@testing.resolve_artifact_names
def test_autocommit_doesnt_raise_on_pending(self):
mapper(User, users)
@@ -430,7 +430,7 @@ class SessionTest(_fixtures.FixtureTest):
session.begin()
session.flush()
session.commit()
-
+
def test_active_flag(self):
sess = create_session(bind=config.db, autocommit=True)
assert not sess.is_active
@@ -438,7 +438,7 @@ class SessionTest(_fixtures.FixtureTest):
assert sess.is_active
sess.rollback()
assert not sess.is_active
-
+
@testing.resolve_artifact_names
def test_textual_execute(self):
"""test that Session.execute() converts to text()"""
@@ -525,15 +525,15 @@ class SessionTest(_fixtures.FixtureTest):
def test_transactions_isolated(self):
mapper(User, users)
users.delete().execute()
-
+
s1 = create_session(bind=testing.db, autocommit=False)
s2 = create_session(bind=testing.db, autocommit=False)
u1 = User(name='u1')
s1.add(u1)
s1.flush()
-
+
assert s2.query(User).all() == []
-
+
@testing.requires.two_phase_transactions
@testing.resolve_artifact_names
def test_twophase(self):
@@ -727,7 +727,7 @@ class SessionTest(_fixtures.FixtureTest):
sa.exc.DBAPIError,
sess.commit
)
-
+
for i in range(5):
assert_raises_message(sa.exc.InvalidRequestError,
"^This Session's transaction has been "
@@ -740,8 +740,8 @@ class SessionTest(_fixtures.FixtureTest):
sess.rollback()
sess.add(User(id=5, name='some name'))
sess.commit()
-
-
+
+
@testing.resolve_artifact_names
def test_no_autocommit_with_explicit_commit(self):
mapper(User, users)
@@ -861,7 +861,7 @@ class SessionTest(_fixtures.FixtureTest):
assert user not in s
s.delete(user)
assert user in s
-
+
s.flush()
assert user not in s
assert s.query(User).count() == 0
@@ -959,17 +959,17 @@ class SessionTest(_fixtures.FixtureTest):
del user
s.add(u2)
-
+
del u2
gc_collect()
-
+
assert len(s.identity_map) == 1
assert len(s.dirty) == 1
assert None not in s.dirty
s.flush()
gc_collect()
assert not s.dirty
-
+
assert not s.identity_map
@testing.resolve_artifact_names
@@ -990,8 +990,8 @@ class SessionTest(_fixtures.FixtureTest):
assert_raises(AssertionError, s.identity_map.add,
sa.orm.attributes.instance_state(u2))
-
-
+
+
@testing.resolve_artifact_names
def test_weakref_with_cycles_o2m(self):
s = sessionmaker()()
@@ -1001,11 +1001,11 @@ class SessionTest(_fixtures.FixtureTest):
mapper(Address, addresses)
s.add(User(name="ed", addresses=[Address(email_address="ed1")]))
s.commit()
-
+
user = s.query(User).options(joinedload(User.addresses)).one()
user.addresses[0].user # lazyload
eq_(user, User(name="ed", addresses=[Address(email_address="ed1")]))
-
+
del user
gc_collect()
assert len(s.identity_map) == 0
@@ -1016,11 +1016,11 @@ class SessionTest(_fixtures.FixtureTest):
del user
gc_collect()
assert len(s.identity_map) == 2
-
+
s.commit()
user = s.query(User).options(joinedload(User.addresses)).one()
eq_(user, User(name="ed", addresses=[Address(email_address="ed2")]))
-
+
@testing.resolve_artifact_names
def test_weakref_with_cycles_o2o(self):
s = sessionmaker()()
@@ -1046,11 +1046,11 @@ class SessionTest(_fixtures.FixtureTest):
del user
gc_collect()
assert len(s.identity_map) == 2
-
+
s.commit()
user = s.query(User).options(joinedload(User.address)).one()
eq_(user, User(name="ed", address=Address(email_address="ed2")))
-
+
@testing.resolve_artifact_names
def test_strong_ref(self):
s = create_session(weak_identity_map=False)
@@ -1071,7 +1071,7 @@ class SessionTest(_fixtures.FixtureTest):
assert s.identity_map._modified
s.flush()
eq_(users.select().execute().fetchall(), [(user.id, 'u2')])
-
+
@testing.fails_on('+zxjdbc', 'http://www.sqlalchemy.org/trac/ticket/1473')
@testing.resolve_artifact_names
def test_prune(self):
@@ -1198,10 +1198,10 @@ class SessionTest(_fixtures.FixtureTest):
mapper(User, users)
sess = Session()
-
+
sess.add_all([User(name='u1'), User(name='u2'), User(name='u3')])
sess.commit()
-
+
u1, u2, u3 = sess.query(User).all()
for i, (key, value) in enumerate(sess.identity_map.iteritems()):
if i == 2:
@@ -1212,7 +1212,7 @@ class DisposedStates(_base.MappedTest):
run_setup_mappers = 'once'
run_inserts = 'once'
run_deletes = None
-
+
@classmethod
def define_tables(cls, metadata):
global t1
@@ -1227,25 +1227,25 @@ class DisposedStates(_base.MappedTest):
def __init__(self, data):
self.data = data
mapper(T, t1)
-
+
def teardown(self):
from sqlalchemy.orm.session import _sessions
_sessions.clear()
super(DisposedStates, self).teardown()
-
+
def _set_imap_in_disposal(self, sess, *objs):
"""remove selected objects from the given session, as though
they were dereferenced and removed from WeakIdentityMap.
-
+
Hardcodes the identity map's "all_states()" method to return the
full list of states. This simulates the all_states() method
returning results, afterwhich some of the states get garbage
collected (this normally only happens during asynchronous gc).
The Session now has one or more InstanceState's which have been
removed from the identity map and disposed.
-
+
Will the Session not trip over this ??? Stay tuned.
-
+
"""
all_states = sess.identity_map.all_states()
@@ -1254,7 +1254,7 @@ class DisposedStates(_base.MappedTest):
state = attributes.instance_state(obj)
sess.identity_map.remove(state)
state.dispose()
-
+
def _test_session(self, **kwargs):
global sess
sess = create_session(**kwargs)
@@ -1268,32 +1268,32 @@ class DisposedStates(_base.MappedTest):
o1.data = 't1modified'
o5.data = 't5modified'
-
+
self._set_imap_in_disposal(sess, o2, o4, o5)
return sess
-
+
def test_flush(self):
self._test_session().flush()
-
+
def test_clear(self):
self._test_session().expunge_all()
-
+
def test_close(self):
self._test_session().close()
-
+
def test_expunge_all(self):
self._test_session().expunge_all()
-
+
def test_expire_all(self):
self._test_session().expire_all()
-
+
def test_rollback(self):
sess = self._test_session(autocommit=False, expire_on_commit=True)
sess.commit()
-
+
sess.rollback()
-
-
+
+
class SessionInterface(testing.TestBase):
"""Bogus args to Session methods produce actionable exceptions."""
diff --git a/test/orm/test_subquery_relations.py b/test/orm/test_subquery_relations.py
index 2aadf26d4..b306dcbba 100644
--- a/test/orm/test_subquery_relations.py
+++ b/test/orm/test_subquery_relations.py
@@ -14,7 +14,7 @@ import sqlalchemy as sa
class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
run_inserts = 'once'
run_deletes = None
-
+
@testing.resolve_artifact_names
def test_basic(self):
mapper(User, users, properties={
@@ -23,18 +23,18 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
order_by=Address.id)
})
sess = create_session()
-
+
q = sess.query(User).options(subqueryload(User.addresses))
-
+
def go():
eq_(
[User(id=7, addresses=[
Address(id=1, email_address='jack@bean.com')])],
q.filter(User.id==7).all()
)
-
+
self.assert_sql_count(testing.db, go, 2)
-
+
def go():
eq_(
self.static.user_address_result,
@@ -54,9 +54,9 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
order_by=Address.id)
})
sess = create_session()
-
+
u = aliased(User)
-
+
q = sess.query(u).options(subqueryload(u.addresses))
def go():
@@ -74,10 +74,10 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
q.order_by(u.id).all()
)
self.assert_sql_count(testing.db, go, 2)
-
+
q = sess.query(u).\
options(subqueryload_all(u.addresses, Address.dingalings))
-
+
def go():
eq_(
[
@@ -93,8 +93,8 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
q.filter(u.id.in_([8, 9])).all()
)
self.assert_sql_count(testing.db, go, 3)
-
-
+
+
@testing.resolve_artifact_names
def test_from_get(self):
mapper(User, users, properties={
@@ -103,7 +103,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
order_by=Address.id)
})
sess = create_session()
-
+
q = sess.query(User).options(subqueryload(User.addresses))
def go():
eq_(
@@ -111,7 +111,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
Address(id=1, email_address='jack@bean.com')]),
q.get(7)
)
-
+
self.assert_sql_count(testing.db, go, 2)
@testing.resolve_artifact_names
@@ -132,7 +132,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
)
self.assert_sql_count(testing.db, go, 2)
-
+
@testing.resolve_artifact_names
def test_disable_dynamic(self):
"""test no subquery option on a dynamic."""
@@ -142,7 +142,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
})
mapper(Address, addresses)
sess = create_session()
-
+
# previously this would not raise, but would emit
# the query needlessly and put the result nowhere.
assert_raises_message(
@@ -150,7 +150,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
"User.addresses' does not support object population - eager loading cannot be applied.",
sess.query(User).options(subqueryload(User.addresses)).first,
)
-
+
@testing.resolve_artifact_names
def test_many_to_many(self):
mapper(Keyword, keywords)
@@ -290,10 +290,10 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
def test_options_pathing(self):
self._do_options_test(self._pathing_runs)
-
+
def test_mapper_pathing(self):
self._do_mapper_test(self._pathing_runs)
-
+
@testing.resolve_artifact_names
def _do_options_test(self, configs):
mapper(User, users, properties={
@@ -309,12 +309,12 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
order_by=keywords.c.id) #m2m
})
mapper(Keyword, keywords)
-
+
callables = {
'joinedload':joinedload,
'subqueryload':subqueryload
}
-
+
for o, i, k, count in configs:
options = []
if o in callables:
@@ -349,12 +349,12 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
order_by=keywords.c.id)
})
mapper(Keyword, keywords)
-
+
try:
self._do_query_tests([], count)
finally:
clear_mappers()
-
+
@testing.resolve_artifact_names
def _do_query_tests(self, opts, count):
sess = create_session()
@@ -378,8 +378,8 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
order_by(User.id).all(),
self.static.user_item_keyword_result[0:1]
)
-
-
+
+
@testing.resolve_artifact_names
def test_cyclical(self):
"""A circular eager relationship breaks the cycle with a lazy loader"""
@@ -710,7 +710,7 @@ class SelfReferentialTest(_base.MappedTest):
n2.append(Node(data='n21'))
n2.children[0].append(Node(data='n211'))
n2.children[0].append(Node(data='n212'))
-
+
sess.add(n1)
sess.add(n2)
sess.flush()
@@ -890,4 +890,4 @@ class SelfReferentialTest(_base.MappedTest):
], d)
self.assert_sql_count(testing.db, go, 4)
-
+
diff --git a/test/orm/test_transaction.py b/test/orm/test_transaction.py
index 9cb9604a7..d27bf1af2 100644
--- a/test/orm/test_transaction.py
+++ b/test/orm/test_transaction.py
@@ -23,10 +23,10 @@ class TransactionTest(FixtureTest):
})
mapper(Address, addresses)
-
+
class FixtureDataTest(TransactionTest):
run_inserts = 'each'
-
+
def test_attrs_on_rollback(self):
sess = self.session()
u1 = sess.query(User).get(7)
@@ -93,13 +93,13 @@ class AutoExpireTest(TransactionTest):
s.rollback()
assert u1 in s
assert u1 not in s.deleted
-
+
def test_gced_delete_on_rollback(self):
s = self.session()
u1 = User(name='ed')
s.add(u1)
s.commit()
-
+
s.delete(u1)
u1_state = attributes.instance_state(u1)
assert u1_state in s.identity_map.all_states()
@@ -110,7 +110,7 @@ class AutoExpireTest(TransactionTest):
del u1
gc_collect()
assert u1_state.obj() is None
-
+
s.rollback()
assert u1_state in s.identity_map.all_states()
u1 = s.query(User).filter_by(name='ed').one()
@@ -120,7 +120,7 @@ class AutoExpireTest(TransactionTest):
s.flush()
assert s.scalar(users.count()) == 0
s.commit()
-
+
def test_trans_deleted_cleared_on_rollback(self):
s = self.session()
u1 = User(name='ed')
@@ -189,14 +189,14 @@ class TwoPhaseTest(TransactionTest):
@testing.requires.two_phase_transactions
def test_rollback_on_prepare(self):
s = self.session(twophase=True)
-
+
u = User(name='ed')
s.add(u)
s.prepare()
s.rollback()
-
+
assert u not in s
-
+
class RollbackRecoverTest(TransactionTest):
def test_pk_violation(self):
@@ -416,7 +416,7 @@ class AccountingFlagsTest(TransactionTest):
sess.commit()
testing.db.execute(users.update(users.c.name=='ed').values(name='edward'))
-
+
assert u1.name == 'ed'
sess.expire_all()
assert u1.name == 'edward'
@@ -429,7 +429,7 @@ class AccountingFlagsTest(TransactionTest):
u1.name = 'edwardo'
sess.rollback()
-
+
testing.db.execute(users.update(users.c.name=='ed').values(name='edward'))
assert u1.name == 'edwardo'
@@ -449,30 +449,30 @@ class AccountingFlagsTest(TransactionTest):
assert u1.name == 'edwardo'
sess.commit()
-
+
assert testing.db.execute(select([users.c.name])).fetchall() == [('edwardo',)]
assert u1.name == 'edwardo'
sess.delete(u1)
sess.commit()
-
+
def test_preflush_no_accounting(self):
sess = sessionmaker(_enable_transaction_accounting=False, autocommit=True)()
u1 = User(name='ed')
sess.add(u1)
sess.flush()
-
+
sess.begin()
u1.name = 'edwardo'
u2 = User(name="some other user")
sess.add(u2)
-
+
sess.rollback()
sess.begin()
assert testing.db.execute(select([users.c.name])).fetchall() == [('ed',)]
-
-
+
+
class AutoCommitTest(TransactionTest):
def test_begin_nested_requires_trans(self):
sess = create_session(autocommit=True)
@@ -483,7 +483,7 @@ class AutoCommitTest(TransactionTest):
u1 = User(name='ed')
sess.add(u1)
-
+
sess.begin()
u2 = User(name='some other user')
sess.add(u2)
@@ -533,7 +533,7 @@ class NaturalPKRollbackTest(_base.MappedTest):
session.rollback()
-
-
+
+
diff --git a/test/orm/test_unitofwork.py b/test/orm/test_unitofwork.py
index e85166f68..d5cd46916 100644
--- a/test/orm/test_unitofwork.py
+++ b/test/orm/test_unitofwork.py
@@ -64,7 +64,7 @@ class UnicodeTest(_base.MappedTest):
uni_type = VARCHAR(50, collation='utf8_unicode_ci')
else:
uni_type = sa.Unicode(50)
-
+
Table('uni_t1', metadata,
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
@@ -94,7 +94,7 @@ class UnicodeTest(_base.MappedTest):
session.commit()
self.assert_(t1.txt == txt)
-
+
@testing.resolve_artifact_names
def test_relationship(self):
mapper(Test, uni_t1, properties={
@@ -226,17 +226,17 @@ class BinaryHistTest(_base.MappedTest, testing.AssertsExecutionResults):
@testing.resolve_artifact_names
def test_binary_equality(self):
-
+
# Py3K
#data = b"this is some data"
# Py2K
data = "this is some data"
# end Py2K
-
+
mapper(Foo, t1)
-
+
s = create_session()
-
+
f1 = Foo(data=data)
s.add(f1)
s.flush()
@@ -251,8 +251,8 @@ class BinaryHistTest(_base.MappedTest, testing.AssertsExecutionResults):
def go():
s.flush()
self.assert_sql_count(testing.db, go, 0)
-
-
+
+
@@ -491,12 +491,12 @@ class PassiveDeletesTest(_base.MappedTest):
assert mytable.count().scalar() == 0
assert myothertable.count().scalar() == 0
-
+
@testing.emits_warning(r".*'passive_deletes' is normally configured on one-to-many")
@testing.resolve_artifact_names
def test_backwards_pd(self):
"""Test that passive_deletes=True disables a delete from an m2o.
-
+
This is not the usual usage and it now raises a warning, but test
that it works nonetheless.
@@ -505,7 +505,7 @@ class PassiveDeletesTest(_base.MappedTest):
'myclass':relationship(MyClass, cascade="all, delete", passive_deletes=True)
})
mapper(MyClass, mytable)
-
+
session = create_session()
mc = MyClass()
mco = MyOtherClass()
@@ -515,15 +515,15 @@ class PassiveDeletesTest(_base.MappedTest):
assert mytable.count().scalar() == 1
assert myothertable.count().scalar() == 1
-
+
session.expire(mco, ['myclass'])
session.delete(mco)
session.flush()
-
+
# mytable wasn't deleted, is the point.
assert mytable.count().scalar() == 1
assert myothertable.count().scalar() == 0
-
+
@testing.resolve_artifact_names
def test_aaa_m2o_emits_warning(self):
mapper(MyOtherClass, myothertable, properties={
@@ -531,7 +531,7 @@ class PassiveDeletesTest(_base.MappedTest):
})
mapper(MyClass, mytable)
assert_raises(sa.exc.SAWarning, sa.orm.configure_mappers)
-
+
class ExtraPassiveDeletesTest(_base.MappedTest):
__requires__ = ('foreign_keys',)
@@ -628,19 +628,19 @@ class ColumnCollisionTest(_base.MappedTest):
Column('book_id', String(50)),
Column('title', String(50))
)
-
+
@testing.resolve_artifact_names
def test_naming(self):
class Book(_base.ComparableEntity):
pass
-
+
mapper(Book, book)
sess = create_session()
-
+
b1 = Book(book_id='abc', title='def')
sess.add(b1)
sess.flush()
-
+
b1.title = 'ghi'
sess.flush()
sess.close()
@@ -648,9 +648,9 @@ class ColumnCollisionTest(_base.MappedTest):
sess.query(Book).first(),
Book(book_id='abc', title='ghi')
)
-
-
-
+
+
+
class DefaultTest(_base.MappedTest):
"""Exercise mappings on columns with DefaultGenerators.
@@ -847,12 +847,12 @@ class ColumnPropertyTest(_base.MappedTest):
Column('id', Integer, ForeignKey('data.id'), primary_key=True),
Column('c', String(50)),
)
-
+
@classmethod
def setup_mappers(cls):
class Data(_base.BasicEntity):
pass
-
+
@testing.resolve_artifact_names
def test_refreshes(self):
mapper(Data, data, properties={
@@ -865,7 +865,7 @@ class ColumnPropertyTest(_base.MappedTest):
m = mapper(Data, data)
m.add_property('aplusb', column_property(data.c.a + literal_column("' '") + data.c.b))
self._test()
-
+
@testing.resolve_artifact_names
def test_with_inheritance(self):
class SubData(Data):
@@ -874,32 +874,32 @@ class ColumnPropertyTest(_base.MappedTest):
'aplusb':column_property(data.c.a + literal_column("' '") + data.c.b)
})
mapper(SubData, subdata, inherits=Data)
-
+
sess = create_session()
sd1 = SubData(a="hello", b="there", c="hi")
sess.add(sd1)
sess.flush()
eq_(sd1.aplusb, "hello there")
-
+
@testing.resolve_artifact_names
def _test(self):
sess = create_session()
-
+
d1 = Data(a="hello", b="there")
sess.add(d1)
sess.flush()
-
+
eq_(d1.aplusb, "hello there")
-
+
d1.b = "bye"
sess.flush()
eq_(d1.aplusb, "hello bye")
-
+
d1.b = 'foobar'
d1.aplusb = 'im setting this explicitly'
sess.flush()
eq_(d1.aplusb, "im setting this explicitly")
-
+
class OneToManyTest(_fixtures.FixtureTest):
run_inserts = None
@@ -1372,29 +1372,29 @@ class SaveTest(_fixtures.FixtureTest):
assert instance is self.current_instance
mapper(User, users, batch=False)
-
+
evt = Events()
event.listen(User, "before_insert", evt.before_insert)
event.listen(User, "after_insert", evt.after_insert)
-
+
u1 = User(name='user1')
u2 = User(name='user2')
session = create_session()
session.add_all((u1, u2))
session.flush()
-
+
u3 = User(name='user3')
u4 = User(name='user4')
u5 = User(name='user5')
-
+
session.add_all([u4, u5, u3])
session.flush()
-
+
# test insert ordering is maintained
assert names == ['user1', 'user2', 'user4', 'user5', 'user3']
session.expunge_all()
-
+
sa.orm.clear_mappers()
m = mapper(User, users)
@@ -1930,14 +1930,14 @@ class BooleanColTest(_base.MappedTest):
class DontAllowFlushOnLoadingObjectTest(_base.MappedTest):
"""Test that objects with NULL identity keys aren't permitted to complete a flush.
-
+
User-defined callables that execute during a load may modify state
on instances which results in their being autoflushed, before attributes
are populated. If the primary key identifiers are missing, an explicit assertion
is needed to check that the object doesn't go through the flush process with
no net changes and gets placed in the identity map with an incorrect
identity key.
-
+
"""
@classmethod
def define_tables(cls, metadata):
@@ -1945,7 +1945,7 @@ class DontAllowFlushOnLoadingObjectTest(_base.MappedTest):
Column('id', Integer, primary_key=True),
Column('data', String(30)),
)
-
+
@testing.resolve_artifact_names
def test_flush_raises(self):
class T1(_base.ComparableEntity):
@@ -1956,28 +1956,28 @@ class DontAllowFlushOnLoadingObjectTest(_base.MappedTest):
# before 'id' was even populated, i.e. a callable
# within an attribute_mapped_collection
self.__dict__.pop('id', None)
-
+
# generate a change event, perhaps this occurs because
# someone wrote a broken attribute_mapped_collection that
# inappropriately fires off change events when it should not,
# now we're dirty
self.data = 'foo bar'
-
+
# blow away that change, so an UPDATE does not occur
# (since it would break)
self.__dict__.pop('data', None)
-
+
# flush ! any lazyloader here would trigger
# autoflush, for example.
sess.flush()
-
+
mapper(T1, t1)
-
+
sess = Session()
sess.add(T1(data='test', id=5))
sess.commit()
sess.close()
-
+
# make sure that invalid state doesn't get into the session
# with the wrong key. If the identity key is not NULL, at least
# the population process would continue after the erroneous flush
@@ -1987,9 +1987,9 @@ class DontAllowFlushOnLoadingObjectTest(_base.MappedTest):
'flush is occuring at an inappropriate '
'time, such as during a load operation.',
sess.query(T1).first)
-
-
-
+
+
+
class RowSwitchTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -2096,7 +2096,7 @@ class RowSwitchTest(_base.MappedTest):
assert o5 in sess.deleted
assert o5.t7s[0] in sess.deleted
assert o5.t7s[1] in sess.deleted
-
+
sess.add(o6)
sess.flush()
@@ -2151,17 +2151,17 @@ class InheritingRowSwitchTest(_base.MappedTest):
class C(P):
pass
-
+
@testing.resolve_artifact_names
def test_row_switch_no_child_table(self):
mapper(P, parent)
mapper(C, child, inherits=P)
-
+
sess = create_session()
c1 = C(id=1, pdata='c1', cdata='c1')
sess.add(c1)
sess.flush()
-
+
# establish a row switch between c1 and c2.
# c2 has no value for the "child" table
c2 = C(id=1, pdata='c2')
@@ -2172,7 +2172,7 @@ class InheritingRowSwitchTest(_base.MappedTest):
CompiledSQL("UPDATE parent SET pdata=:pdata WHERE parent.id = :parent_id",
{'pdata':'c2', 'parent_id':1}
),
-
+
# this fires as of [ticket:1362], since we synchronzize
# PK/FKs on UPDATES. c2 is new so the history shows up as
# pure added, update occurs. If a future change limits the
@@ -2181,8 +2181,8 @@ class InheritingRowSwitchTest(_base.MappedTest):
{'pid':1, 'child_id':1}
)
)
-
-
+
+
class TransactionTest(_base.MappedTest):
__requires__ = ('deferrable_constraints',)
diff --git a/test/orm/test_unitofworkv2.py b/test/orm/test_unitofworkv2.py
index 10049175a..7018f2338 100644
--- a/test/orm/test_unitofworkv2.py
+++ b/test/orm/test_unitofworkv2.py
@@ -25,7 +25,7 @@ class AssertsUOW(object):
for d in deleted:
uow.register_object(d, isdelete=True)
return uow
-
+
def _assert_uow_size(self,
session,
expected
@@ -51,7 +51,7 @@ class RudimentaryFlushTest(UOWTest):
a1, a2 = Address(email_address='a1'), Address(email_address='a2')
u1 = User(name='u1', addresses=[a1, a2])
sess.add(u1)
-
+
self.assert_sql_execution(
testing.db,
sess.flush,
@@ -81,7 +81,7 @@ class RudimentaryFlushTest(UOWTest):
u1 = User(name='u1', addresses=[a1, a2])
sess.add(u1)
sess.flush()
-
+
sess.delete(u1)
sess.delete(a1)
sess.delete(a2)
@@ -128,9 +128,9 @@ class RudimentaryFlushTest(UOWTest):
{'id':u1.id}
),
)
-
+
def test_many_to_one_save(self):
-
+
mapper(User, users)
mapper(Address, addresses, properties={
'user':relationship(User)
@@ -141,7 +141,7 @@ class RudimentaryFlushTest(UOWTest):
a1, a2 = Address(email_address='a1', user=u1), \
Address(email_address='a2', user=u1)
sess.add_all([a1, a2])
-
+
self.assert_sql_execution(
testing.db,
sess.flush,
@@ -173,7 +173,7 @@ class RudimentaryFlushTest(UOWTest):
Address(email_address='a2', user=u1)
sess.add_all([a1, a2])
sess.flush()
-
+
sess.delete(u1)
sess.delete(a1)
sess.delete(a2)
@@ -233,25 +233,25 @@ class RudimentaryFlushTest(UOWTest):
parent = User(name='p1')
c1, c2 = Address(email_address='c1', parent=parent), \
Address(email_address='c2', parent=parent)
-
+
session = Session()
session.add_all([c1, c2])
session.add(parent)
session.flush()
-
+
pid = parent.id
c1id = c1.id
c2id = c2.id
-
+
session.expire(parent)
session.expire(c1)
session.expire(c2)
-
+
session.delete(c1)
session.delete(c2)
session.delete(parent)
-
+
# testing that relationships
# are loaded even if all ids/references are
# expired
@@ -291,13 +291,13 @@ class RudimentaryFlushTest(UOWTest):
lambda ctx: {'id': pid}
),
)
-
+
def test_many_to_many(self):
mapper(Item, items, properties={
'keywords':relationship(Keyword, secondary=item_keywords)
})
mapper(Keyword, keywords)
-
+
sess = create_session()
k1 = Keyword(name='k1')
i1 = Item(description='i1', keywords=[k1])
@@ -321,7 +321,7 @@ class RudimentaryFlushTest(UOWTest):
lambda ctx:{'item_id':i1.id, 'keyword_id':k1.id}
)
)
-
+
# test that keywords collection isn't loaded
sess.expire(i1, ['keywords'])
i1.description = 'i2'
@@ -332,7 +332,7 @@ class RudimentaryFlushTest(UOWTest):
"WHERE items.id = :items_id",
lambda ctx:{'description':'i2', 'items_id':i1.id})
)
-
+
def test_m2o_flush_size(self):
mapper(User, users)
mapper(Address, addresses, properties={
@@ -389,13 +389,13 @@ class SingleCycleTest(UOWTest):
n2, n3 = Node(data='n2'), Node(data='n3')
n1 = Node(data='n1', children=[n2, n3])
-
+
sess.add(n1)
-
+
self.assert_sql_execution(
testing.db,
sess.flush,
-
+
CompiledSQL(
"INSERT INTO nodes (parent_id, data) VALUES "
"(:parent_id, :data)",
@@ -426,7 +426,7 @@ class SingleCycleTest(UOWTest):
sess.add(n1)
sess.flush()
-
+
sess.delete(n1)
sess.delete(n2)
sess.delete(n3)
@@ -466,7 +466,7 @@ class SingleCycleTest(UOWTest):
CompiledSQL("DELETE FROM nodes WHERE nodes.id = :id",
lambda ctx:{'id':n1.id})
)
-
+
def test_many_to_one_save(self):
mapper(Node, nodes, properties={
'parent':relationship(Node, remote_side=nodes.c.id)
@@ -512,7 +512,7 @@ class SingleCycleTest(UOWTest):
sess.add_all([n2, n3])
sess.flush()
-
+
sess.delete(n1)
sess.delete(n2)
sess.delete(n3)
@@ -524,7 +524,7 @@ class SingleCycleTest(UOWTest):
CompiledSQL("DELETE FROM nodes WHERE nodes.id = :id",
lambda ctx: {'id':n1.id})
)
-
+
def test_cycle_rowswitch(self):
mapper(Node, nodes, properties={
'children':relationship(Node)
@@ -540,7 +540,7 @@ class SingleCycleTest(UOWTest):
n3.id = n2.id
n1.children.append(n3)
sess.flush()
-
+
def test_bidirectional_mutations_one(self):
mapper(Node, nodes, properties={
'children':relationship(Node,
@@ -556,11 +556,11 @@ class SingleCycleTest(UOWTest):
sess.delete(n2)
n1.children.append(n3)
sess.flush()
-
+
sess.delete(n1)
sess.delete(n3)
sess.flush()
-
+
def test_bidirectional_multilevel_save(self):
mapper(Node, nodes, properties={
'children':relationship(Node,
@@ -627,27 +627,27 @@ class SingleCycleTest(UOWTest):
self._assert_uow_size(sess, 2)
sess.flush()
-
+
n1.data='jack'
self._assert_uow_size(sess, 2)
sess.flush()
-
+
n2 = Node(data='foo')
sess.add(n2)
sess.flush()
-
+
n1.children.append(n2)
self._assert_uow_size(sess, 3)
-
+
sess.flush()
-
+
sess = create_session()
n1 = sess.query(Node).first()
n1.data='ed'
self._assert_uow_size(sess, 2)
-
+
n1.children
self._assert_uow_size(sess, 2)
@@ -658,25 +658,25 @@ class SingleCycleTest(UOWTest):
parent = Node()
c1, c2 = Node(parent=parent), Node(parent=parent)
-
+
session = Session()
session.add_all([c1, c2])
session.add(parent)
session.flush()
-
+
pid = parent.id
c1id = c1.id
c2id = c2.id
-
+
session.expire(parent)
session.expire(c1)
session.expire(c2)
-
+
session.delete(c1)
session.delete(c2)
session.delete(parent)
-
+
# testing that relationships
# are loaded even if all ids/references are
# expired
@@ -718,9 +718,9 @@ class SingleCycleTest(UOWTest):
lambda ctx: {'id': pid}
),
)
-
-
-
+
+
+
class SingleCyclePlusAttributeTest(_base.MappedTest,
testing.AssertsExecutionResults, AssertsUOW):
@classmethod
@@ -731,7 +731,7 @@ class SingleCyclePlusAttributeTest(_base.MappedTest,
Column('parent_id', Integer, ForeignKey('nodes.id')),
Column('data', String(30))
)
-
+
Table('foobars', metadata,
Column('id', Integer, primary_key=True,
test_needs_autoincrement=True),
@@ -758,13 +758,13 @@ class SingleCyclePlusAttributeTest(_base.MappedTest,
sess.add(n1)
# ensure "foobars" doesn't get yanked in here
self._assert_uow_size(sess, 3)
-
+
n1.foobars.append(FooBar())
# saveupdateall/deleteall for FooBar added here,
# plus processstate node.foobars
# currently the "all" procs stay in pairs
self._assert_uow_size(sess, 6)
-
+
sess.flush()
class SingleCycleM2MTest(_base.MappedTest,
@@ -779,19 +779,19 @@ class SingleCycleM2MTest(_base.MappedTest,
Column('data', String(30)),
Column('favorite_node_id', Integer, ForeignKey('nodes.id'))
)
-
+
node_to_nodes =Table('node_to_nodes', metadata,
Column('left_node_id', Integer,
ForeignKey('nodes.id'),primary_key=True),
Column('right_node_id', Integer,
ForeignKey('nodes.id'),primary_key=True),
)
-
+
@testing.resolve_artifact_names
def test_many_to_many_one(self):
class Node(Base):
pass
-
+
mapper(Node, nodes, properties={
'children':relationship(Node, secondary=node_to_nodes,
primaryjoin=nodes.c.id==node_to_nodes.c.left_node_id,
@@ -800,24 +800,24 @@ class SingleCycleM2MTest(_base.MappedTest,
),
'favorite':relationship(Node, remote_side=nodes.c.id)
})
-
+
sess = create_session()
n1 = Node(data='n1')
n2 = Node(data='n2')
n3 = Node(data='n3')
n4 = Node(data='n4')
n5 = Node(data='n5')
-
+
n4.favorite = n3
n1.favorite = n5
n5.favorite = n2
-
+
n1.children = [n2, n3, n4]
n2.children = [n3, n5]
n3.children = [n5, n4]
-
+
sess.add_all([n1, n2, n3, n4, n5])
-
+
# can't really assert the SQL on this easily
# since there's too many ways to insert the rows.
# so check the end result
@@ -834,9 +834,9 @@ class SingleCycleM2MTest(_base.MappedTest,
(n3.id, n5.id), (n3.id, n4.id)
])
)
-
+
sess.delete(n1)
-
+
self.assert_sql_execution(
testing.db,
sess.flush,
@@ -849,7 +849,7 @@ class SingleCycleM2MTest(_base.MappedTest,
"node_to_nodes.right_node_id AND nodes.id = "
"node_to_nodes.left_node_id" ,
lambda ctx:{u'param_1': n1.id},
- ),
+ ),
CompiledSQL(
"DELETE FROM node_to_nodes WHERE "
"node_to_nodes.left_node_id = :left_node_id AND "
@@ -865,15 +865,15 @@ class SingleCycleM2MTest(_base.MappedTest,
lambda ctx:{'id': n1.id}
),
)
-
+
for n in [n2, n3, n4, n5]:
sess.delete(n)
-
+
# load these collections
# outside of the flush() below
n4.children
n5.children
-
+
self.assert_sql_execution(
testing.db,
sess.flush,
@@ -897,7 +897,7 @@ class SingleCycleM2MTest(_base.MappedTest,
lambda ctx:[{'id': n2.id}, {'id': n3.id}]
),
)
-
+
class RowswitchAccountingTest(_base.MappedTest):
@classmethod
def define_tables(cls, metadata):
@@ -907,7 +907,7 @@ class RowswitchAccountingTest(_base.MappedTest):
Table('child', metadata,
Column('id', Integer, ForeignKey('parent.id'), primary_key=True)
)
-
+
@testing.resolve_artifact_names
def test_accounting_for_rowswitch(self):
class Parent(object):
@@ -923,7 +923,7 @@ class RowswitchAccountingTest(_base.MappedTest):
backref="parent")
})
mapper(Child, child)
-
+
sess = create_session(autocommit=False)
p1 = Parent(1)
@@ -964,7 +964,7 @@ class BatchInsertsTest(_base.MappedTest, testing.AssertsExecutionResults):
def test_batch_interaction(self):
"""test batching groups same-structured, primary
key present statements together.
-
+
"""
class T(Base):
pass
diff --git a/test/orm/test_utils.py b/test/orm/test_utils.py
index e196a9617..362b54cf0 100644
--- a/test/orm/test_utils.py
+++ b/test/orm/test_utils.py
@@ -215,5 +215,5 @@ class IdentityKeyTest(_fixtures.FixtureTest):
row = {users.c.id: 1, users.c.name: "Frank"}
key = util.identity_key(User, row=row)
eq_(key, (User, (1,)))
-
+
diff --git a/test/orm/test_versioning.py b/test/orm/test_versioning.py
index 94c0efc10..9da97dc1e 100644
--- a/test/orm/test_versioning.py
+++ b/test/orm/test_versioning.py
@@ -26,13 +26,13 @@ _uuids = [
'782a5f04b4364a53a6fce762f48921c1',
'bef510f2420f4476a7629013ead237f5',
]
-
+
def make_uuid():
"""generate uuids even on Python 2.4 which has no 'uuid'"""
return _uuids.pop(0)
class VersioningTest(_base.MappedTest):
-
+
@classmethod
def define_tables(cls, metadata):
Table('version_table', metadata,
@@ -131,11 +131,11 @@ class VersioningTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_bump_version(self):
"""test that version number can be bumped.
-
+
Ensures that the UPDATE or DELETE is against the
last committed version of version_id_col, not the modified
state.
-
+
"""
mapper(Foo, version_table,
version_id_col=version_table.c.version_id)
@@ -148,19 +148,19 @@ class VersioningTest(_base.MappedTest):
f1.version_id = 2
s1.commit()
eq_(f1.version_id, 2)
-
+
# skip an id, test that history
# is honored
f1.version_id = 4
f1.value = "something new"
s1.commit()
eq_(f1.version_id, 4)
-
+
f1.version_id = 5
s1.delete(f1)
s1.commit()
eq_(s1.query(Foo).count(), 0)
-
+
@testing.emits_warning(r'.*does not support updated rowcount')
@engines.close_open_connections
@testing.resolve_artifact_names
@@ -189,7 +189,7 @@ class VersioningTest(_base.MappedTest):
# reload it - this expires the old version first
s1.refresh(f1s1, lockmode='read')
-
+
# now assert version OK
s1.query(Foo).with_lockmode('read').get(f1s1.id)
@@ -216,13 +216,13 @@ class VersioningTest(_base.MappedTest):
f1s2 = s2.query(Foo).get(f1s1.id)
s2.refresh(f1s2, lockmode='update')
f1s2.value='f1 new value'
-
+
assert_raises(
exc.DBAPIError,
s1.refresh, f1s1, lockmode='update_nowait'
)
s1.rollback()
-
+
s2.commit()
s1.refresh(f1s1, lockmode='update_nowait')
assert f1s1.version_id == f1s2.version_id
@@ -281,16 +281,16 @@ class RowSwitchTest(_base.MappedTest):
session.add(P(id='P1', data='P version 1'))
session.commit()
session.close()
-
+
p = session.query(P).first()
session.delete(p)
session.add(P(id='P1', data="really a row-switch"))
session.commit()
-
+
@testing.resolve_artifact_names
def test_child_row_switch(self):
assert P.c.property.strategy.use_get
-
+
session = sessionmaker()()
session.add(P(id='P1', data='P version 1'))
session.commit()
@@ -369,27 +369,27 @@ class AlternateGeneratorTest(_base.MappedTest):
@testing.resolve_artifact_names
def test_child_row_switch_two(self):
Session = sessionmaker()
-
+
# TODO: not sure this test is
# testing exactly what its looking for
-
+
sess1 = Session()
sess1.add(P(id='P1', data='P version 1'))
sess1.commit()
sess1.close()
-
+
p1 = sess1.query(P).first()
sess2 = Session()
p2 = sess2.query(P).first()
-
+
sess1.delete(p1)
sess1.commit()
-
+
# this can be removed and it still passes
sess1.add(P(id='P1', data='P version 2'))
sess1.commit()
-
+
p2.data = 'P overwritten by concurrent tx'
assert_raises_message(
orm.exc.StaleDataError,
@@ -397,12 +397,12 @@ class AlternateGeneratorTest(_base.MappedTest):
r"1 row\(s\); 0 were matched.",
sess2.commit
)
-
+
class InheritanceTwoVersionIdsTest(_base.MappedTest):
"""Test versioning where both parent/child table have a
versioning column.
-
+
"""
@classmethod
def define_tables(cls, metadata):
@@ -454,7 +454,7 @@ class InheritanceTwoVersionIdsTest(_base.MappedTest):
# base is populated
eq_(select([base.c.version_id]).scalar(), 1)
-
+
@testing.resolve_artifact_names
def test_sub_only(self):
mapper(Base, base)
@@ -471,12 +471,12 @@ class InheritanceTwoVersionIdsTest(_base.MappedTest):
# base is not
eq_(select([base.c.version_id]).scalar(), None)
-
+
@testing.resolve_artifact_names
def test_mismatch_version_col_warning(self):
mapper(Base, base,
version_id_col=base.c.version_id)
-
+
assert_raises_message(
exc.SAWarning,
"Inheriting version_id_col 'version_id' does not "
@@ -487,4 +487,3 @@ class InheritanceTwoVersionIdsTest(_base.MappedTest):
mapper,
Sub, sub, inherits=Base,
version_id_col=sub.c.version_id)
- \ No newline at end of file