summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-08-22 20:35:40 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-08-22 20:35:40 +0000
commit7f296cb94bdf6c5afdd767378d87e50c0a623838 (patch)
tree695746561235d381a7f7080ffb91c82de72fe7f2
parent8b80f9132d2e6e05686fe886a132e435217ffdbd (diff)
downloadsqlalchemy-7f296cb94bdf6c5afdd767378d87e50c0a623838.tar.gz
- ugh ! beta4 is double logging....fixed that....
- added test/fixed eager aliasizing for self-referential m2m relations
-rw-r--r--lib/sqlalchemy/logging.py3
-rw-r--r--lib/sqlalchemy/orm/util.py15
-rw-r--r--test/orm/eager_relations.py38
3 files changed, 48 insertions, 8 deletions
diff --git a/lib/sqlalchemy/logging.py b/lib/sqlalchemy/logging.py
index caaecf302..44b83b253 100644
--- a/lib/sqlalchemy/logging.py
+++ b/lib/sqlalchemy/logging.py
@@ -67,11 +67,12 @@ def is_info_enabled(logger):
def instance_logger(instance, echoflag=None):
if echoflag is not None:
- default_logging(_get_instance_name(instance))
l = logging.getLogger(_get_instance_name(instance))
if echoflag == 'debug':
+ default_logging(_get_instance_name(instance))
l.setLevel(logging.DEBUG)
elif echoflag is True:
+ default_logging(_get_instance_name(instance))
l.setLevel(logging.INFO)
elif echoflag is False:
l.setLevel(logging.NOTSET)
diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py
index b3f58c954..30ecbdfe8 100644
--- a/lib/sqlalchemy/orm/util.py
+++ b/lib/sqlalchemy/orm/util.py
@@ -271,14 +271,15 @@ class PropertyAliasedClauses(AliasedClauses):
if prop.secondary:
self.secondary = prop.secondary.alias()
if parentclauses is not None:
- aliasizer = sql_util.ClauseAdapter(self.alias).\
- chain(sql_util.ClauseAdapter(self.secondary)).\
- chain(sql_util.ClauseAdapter(parentclauses.alias))
+ primary_aliasizer = sql_util.ClauseAdapter(self.secondary).chain(sql_util.ClauseAdapter(parentclauses.alias))
+ secondary_aliasizer = sql_util.ClauseAdapter(self.alias).chain(sql_util.ClauseAdapter(self.secondary))
+
else:
- aliasizer = sql_util.ClauseAdapter(self.alias).\
- chain(sql_util.ClauseAdapter(self.secondary))
- self.secondaryjoin = aliasizer.traverse(secondaryjoin, clone=True)
- self.primaryjoin = aliasizer.traverse(primaryjoin, clone=True)
+ primary_aliasizer = sql_util.ClauseAdapter(self.secondary)
+ secondary_aliasizer = sql_util.ClauseAdapter(self.alias).chain(sql_util.ClauseAdapter(self.secondary))
+
+ self.secondaryjoin = secondary_aliasizer.traverse(secondaryjoin, clone=True)
+ self.primaryjoin = primary_aliasizer.traverse(primaryjoin, clone=True)
else:
if parentclauses is not None:
aliasizer = sql_util.ClauseAdapter(self.alias, exclude=prop.local_side)
diff --git a/test/orm/eager_relations.py b/test/orm/eager_relations.py
index 7751e6372..749c28657 100644
--- a/test/orm/eager_relations.py
+++ b/test/orm/eager_relations.py
@@ -510,5 +510,43 @@ class SelfReferentialEagerTest(ORMTest):
]) == d
self.assert_sql_count(testbase.db, go, 3)
+class SelfReferentialM2MEagerTest(ORMTest):
+ def define_tables(self, metadata):
+ global widget, widget_rel
+
+ widget = Table('widget', metadata,
+ Column('id', Integer, primary_key=True),
+ Column('name', Unicode(40), nullable=False, unique=True),
+ )
+
+ widget_rel = Table('widget_rel', metadata,
+ Column('parent_id', Integer, ForeignKey('widget.id')),
+ Column('child_id', Integer, ForeignKey('widget.id')),
+ UniqueConstraint('parent_id', 'child_id'),
+ )
+ def test_basic(self):
+ class Widget(Base):
+ pass
+
+ mapper(Widget, widget, properties={
+ 'children': relation(Widget, secondary=widget_rel,
+ primaryjoin=widget_rel.c.parent_id==widget.c.id,
+ secondaryjoin=widget_rel.c.child_id==widget.c.id,
+ lazy=False, join_depth=1,
+ )
+ })
+
+ sess = create_session()
+ w1 = Widget(name='w1')
+ w2 = Widget(name='w2')
+ w1.children.append(w2)
+ sess.save(w1)
+ sess.flush()
+ sess.clear()
+
+# l = sess.query(Widget).filter(Widget.name=='w1').all()
+# print l
+ assert [Widget(name='w1', children=[Widget(name='w2')])] == sess.query(Widget).filter(Widget.name=='w1').all()
+
if __name__ == '__main__':
testbase.main()