summaryrefslogtreecommitdiff
path: root/test/orm/test_naturalpks.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/test_naturalpks.py')
-rw-r--r--test/orm/test_naturalpks.py103
1 files changed, 70 insertions, 33 deletions
diff --git a/test/orm/test_naturalpks.py b/test/orm/test_naturalpks.py
index f0f3ebb21..bb7b8a71d 100644
--- a/test/orm/test_naturalpks.py
+++ b/test/orm/test_naturalpks.py
@@ -33,20 +33,20 @@ class NaturalPKTest(fixtures.MappedTest):
addresses = Table('addresses', metadata,
Column('email', String(50), primary_key=True),
- Column('username', String(50),
+ Column('username', String(50),
ForeignKey('users.username', **fk_args)),
test_needs_fk=True)
items = Table('items', metadata,
Column('itemname', String(50), primary_key=True),
- Column('description', String(100)),
+ Column('description', String(100)),
test_needs_fk=True)
users_to_items = Table('users_to_items', metadata,
- Column('username', String(50),
+ Column('username', String(50),
ForeignKey('users.username', **fk_args),
primary_key=True),
- Column('itemname', String(50),
+ Column('itemname', String(50),
ForeignKey('items.itemname', **fk_args),
primary_key=True),
test_needs_fk=True)
@@ -168,15 +168,15 @@ class NaturalPKTest(fixtures.MappedTest):
def go():
sess.flush()
if not passive_updates:
- # test passive_updates=False;
+ # test passive_updates=False;
#load addresses, update user, update 2 addresses
- self.assert_sql_count(testing.db, go, 4)
+ self.assert_sql_count(testing.db, go, 4)
else:
# test passive_updates=True; update user
- self.assert_sql_count(testing.db, go, 1)
+ self.assert_sql_count(testing.db, go, 1)
sess.expunge_all()
assert User(username='jack', addresses=[
- Address(username='jack'),
+ Address(username='jack'),
Address(username='jack')]) == \
sess.query(User).get('jack')
@@ -189,7 +189,6 @@ class NaturalPKTest(fixtures.MappedTest):
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')
def test_manytoone_passive(self):
@@ -198,6 +197,43 @@ class NaturalPKTest(fixtures.MappedTest):
def test_manytoone_nonpassive(self):
self._test_manytoone(False)
+ def test_manytoone_nonpassive_cold_mapping(self):
+ """test that the mapper-level m2o dependency processor
+ is set up even if the opposite side relationship
+ hasn't yet been part of a flush.
+
+ """
+ users, Address, addresses, User = (self.tables.users,
+ self.classes.Address,
+ self.tables.addresses,
+ self.classes.User)
+
+ with testing.db.begin() as conn:
+ conn.execute(users.insert(),
+ username='jack', fullname='jack'
+ )
+ conn.execute(addresses.insert(),
+ email='jack1', username='jack'
+ )
+ conn.execute(addresses.insert(),
+ email='jack2', username='jack'
+ )
+
+ mapper(User, users)
+ mapper(Address, addresses, properties={
+ 'user': relationship(User,
+ passive_updates=False)
+ })
+
+ sess = create_session()
+ u1 = sess.query(User).first()
+ a1, a2 = sess.query(Address).all()
+ u1.username = 'ed'
+
+ def go():
+ sess.flush()
+ self.assert_sql_count(testing.db, go, 3)
+
def _test_manytoone(self, passive_updates):
users, Address, addresses, User = (self.tables.users,
self.classes.Address,
@@ -206,7 +242,7 @@ class NaturalPKTest(fixtures.MappedTest):
mapper(User, users)
mapper(Address, addresses, properties={
- 'user':relationship(User, passive_updates=passive_updates)
+ 'user': relationship(User, passive_updates=passive_updates)
})
sess = create_session()
@@ -238,6 +274,7 @@ class NaturalPKTest(fixtures.MappedTest):
eq_([Address(username='ed'), 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_onetoone_passive(self):
@@ -349,9 +386,9 @@ class NaturalPKTest(fixtures.MappedTest):
def test_manytomany_passive(self):
self._test_manytomany(True)
- # mysqldb executemany() of the association table fails to
+ # mysqldb executemany() of the association table fails to
# report the correct row count
- @testing.fails_if(lambda: testing.against('mysql')
+ @testing.fails_if(lambda: testing.against('mysql')
and not testing.against('+zxjdbc'))
def test_manytomany_nonpassive(self):
self._test_manytomany(False)
@@ -489,7 +526,7 @@ class ReversePKsTest(fixtures.MappedTest):
session.add(a_editable)
session.commit()
- # do the switch in both directions -
+ # do the switch in both directions -
# one or the other should raise the error
# based on platform dictionary ordering
a_published.status = ARCHIVED
@@ -509,9 +546,9 @@ class ReversePKsTest(fixtures.MappedTest):
class SelfReferentialTest(fixtures.MappedTest):
- # mssql, mysql don't allow
+ # mssql, mysql don't allow
# ON UPDATE on self-referential keys
- __unsupported_on__ = ('mssql','mysql')
+ __unsupported_on__ = ('mssql','mysql')
@classmethod
def define_tables(cls, metadata):
@@ -596,8 +633,8 @@ class SelfReferentialTest(fixtures.MappedTest):
Node, nodes = self.classes.Node, self.tables.nodes
mapper(Node, nodes, properties={
- 'parentnode':relationship(Node,
- remote_side=nodes.c.name,
+ 'parentnode':relationship(Node,
+ remote_side=nodes.c.name,
passive_updates=passive)
}
)
@@ -686,7 +723,7 @@ class NonPKCascadeTest(fixtures.MappedTest):
u1.username = 'ed'
sess.flush()
assert u1.addresses[0].username == 'ed'
- eq_(sa.select([addresses.c.username]).execute().fetchall(),
+ eq_(sa.select([addresses.c.username]).execute().fetchall(),
[('ed',), ('ed',)])
sess.expunge_all()
@@ -698,14 +735,14 @@ class NonPKCascadeTest(fixtures.MappedTest):
def go():
sess.flush()
if not passive_updates:
- # test passive_updates=False; load addresses,
+ # test passive_updates=False; load addresses,
# update user, update 2 addresses
- self.assert_sql_count(testing.db, go, 4)
+ self.assert_sql_count(testing.db, go, 4)
else:
# test passive_updates=True; update user
self.assert_sql_count(testing.db, go, 1)
sess.expunge_all()
- assert User(username='jack',
+ assert User(username='jack',
addresses=[Address(username='jack'),
Address(username='jack')]) == \
sess.query(User).get(u1.id)
@@ -719,7 +756,7 @@ class NonPKCascadeTest(fixtures.MappedTest):
a1 = sess.query(Address).get(a1.id)
eq_(a1.username, None)
- eq_(sa.select([addresses.c.username]).execute().fetchall(),
+ eq_(sa.select([addresses.c.username]).execute().fetchall(),
[(None,), (None,)])
u1 = sess.query(User).get(u1.id)
@@ -742,7 +779,7 @@ class CascadeToFKPKTest(fixtures.MappedTest, testing.AssertsCompiledSQL):
test_needs_fk=True)
Table('addresses', metadata,
- Column('username', String(50),
+ Column('username', String(50),
ForeignKey('users.username', **fk_args),
primary_key=True
),
@@ -777,7 +814,7 @@ class CascadeToFKPKTest(fixtures.MappedTest, testing.AssertsCompiledSQL):
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
+ "on update cascade" is not involved here, so the mapper has
to do the UPDATE itself.
"""
@@ -945,7 +982,7 @@ class CascadeToFKPKTest(fixtures.MappedTest, testing.AssertsCompiledSQL):
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
+ 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.
@@ -969,7 +1006,7 @@ class CascadeToFKPKTest(fixtures.MappedTest, testing.AssertsCompiledSQL):
sess.flush()
eq_(a1.username, 'ed')
eq_(a2.username, 'ed')
- eq_(sa.select([addresses.c.username]).execute().fetchall(),
+ eq_(sa.select([addresses.c.username]).execute().fetchall(),
[('ed',), ('ed',)])
u1.username = 'jack'
@@ -986,7 +1023,7 @@ class JoinedInheritanceTest(fixtures.MappedTest):
"""Test cascades of pk->pk/fk on joined table inh."""
# mssql doesn't allow ON UPDATE on self-referential keys
- __unsupported_on__ = ('mssql',)
+ __unsupported_on__ = ('mssql',)
__requires__ = 'skip_mysql_on_windows',
@@ -1006,13 +1043,13 @@ class JoinedInheritanceTest(fixtures.MappedTest):
Column('name', String(50), ForeignKey('person.name', **fk_args),
primary_key=True),
Column('primary_language', String(50)),
- Column('boss_name', String(50),
+ Column('boss_name', String(50),
ForeignKey('manager.name', **fk_args)),
test_needs_fk=True
)
Table('manager', metadata,
- Column('name', String(50),
+ Column('name', String(50),
ForeignKey('person.name', **fk_args),
primary_key=True),
Column('paperwork', String(50)),
@@ -1057,12 +1094,12 @@ class JoinedInheritanceTest(fixtures.MappedTest):
self.classes.Engineer,
self.tables.engineer)
- mapper(Person, person, polymorphic_on=person.c.type,
+ mapper(Person, person, polymorphic_on=person.c.type,
polymorphic_identity='person',
passive_updates=passive_updates)
mapper(Engineer, engineer, inherits=Person,
polymorphic_identity='engineer', properties={
- 'boss':relationship(Manager,
+ 'boss':relationship(Manager,
primaryjoin=manager.c.name==engineer.c.boss_name,
passive_updates=passive_updates
)
@@ -1087,12 +1124,12 @@ class JoinedInheritanceTest(fixtures.MappedTest):
self.classes.Engineer,
self.tables.engineer)
- mapper(Person, person, polymorphic_on=person.c.type,
+ mapper(Person, person, polymorphic_on=person.c.type,
polymorphic_identity='person',
passive_updates=passive_updates)
mapper(Engineer, engineer, inherits=Person,
polymorphic_identity='engineer', properties={
- 'boss':relationship(Manager,
+ 'boss':relationship(Manager,
primaryjoin=manager.c.name==engineer.c.boss_name,
passive_updates=passive_updates
)