summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/sync.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-02-10 23:39:06 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-02-10 23:39:06 +0000
commit1da55184e52ae6698ab02c368a43b0c037b17049 (patch)
treeff3c9b90f1a6aaa5e9b50a21f489568eee50f783 /lib/sqlalchemy/orm/sync.py
parent648805f8b4d85aaaa221d2587e45259897d6b9f9 (diff)
downloadsqlalchemy-1da55184e52ae6698ab02c368a43b0c037b17049.tar.gz
- implemented foreign_keys argument on relation() [ticket:385]
- PropertyLoader figures out accurate remote_side collection based on foreign_keys, legacy foreignkey, primary/secondaryjoin/polymorphic - reworked lazyloader, sync to work straight off foreign_keys/ remote_side collections
Diffstat (limited to 'lib/sqlalchemy/orm/sync.py')
-rw-r--r--lib/sqlalchemy/orm/sync.py43
1 files changed, 12 insertions, 31 deletions
diff --git a/lib/sqlalchemy/orm/sync.py b/lib/sqlalchemy/orm/sync.py
index f0a56687f..8d8ee4179 100644
--- a/lib/sqlalchemy/orm/sync.py
+++ b/lib/sqlalchemy/orm/sync.py
@@ -31,7 +31,7 @@ class ClauseSynchronizer(object):
self.direction = direction
self.syncrules = []
- def compile(self, sqlclause, issecondary=None, foreignkey=None):
+ def compile(self, sqlclause, foreign_keys=None, issecondary=None):
def compile_binary(binary):
"""assemble a SyncRule given a single binary condition"""
if binary.operator != '=' or not isinstance(binary.left, schema.Column) or not isinstance(binary.right, schema.Column):
@@ -39,43 +39,24 @@ class ClauseSynchronizer(object):
source_column = None
dest_column = None
- if foreignkey is not None:
- # for self-referential relationships,
- # the best we can do right now is figure out which side
- # is the primary key
- # TODO: need some better way for this
+
+ if foreign_keys is None:
if binary.left.table == binary.right.table:
- if binary.left.primary_key:
- source_column = binary.left
- dest_column = binary.right
- elif binary.right.primary_key:
- source_column = binary.right
- dest_column = binary.left
- elif binary.left in foreignkey:
- dest_column = binary.left
- source_column = binary.right
- elif binary.right in foreignkey:
- dest_column = binary.right
- source_column = binary.left
- else:
- raise exceptions.ArgumentError("Can't figure out which column is source/dest in join clause '%s'" % str(binary))
- # for other relationships we are more flexible
- # and go off the 'foreignkey' property
- elif binary.left in foreignkey:
- dest_column = binary.left
- source_column = binary.right
- elif binary.right in foreignkey:
- dest_column = binary.right
- source_column = binary.left
- else:
- return
- else:
+ raise exceptions.ArgumentError("need foreign_keys argument for self-referential sync")
+
if binary.left in [f.column for f in binary.right.foreign_keys]:
dest_column = binary.right
source_column = binary.left
elif binary.right in [f.column for f in binary.left.foreign_keys]:
dest_column = binary.left
source_column = binary.right
+ else:
+ if binary.left in foreign_keys:
+ source_column=binary.right
+ dest_column = binary.left
+ elif binary.right in foreign_keys:
+ source_column = binary.left
+ dest_column = binary.right
if source_column and dest_column:
if self.direction == ONETOMANY: