diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-11-09 23:20:31 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-11-09 23:20:31 +0000 |
commit | c6724a3ff0c88d77431d7e29ed2747eb90953c95 (patch) | |
tree | 33659a3dd7199b10951eb43024387fa6c102b2ba /lib/sqlalchemy/sql/util.py | |
parent | 89fcf7c3c9fff5737f446d8f4362d7426f934c0d (diff) | |
download | sqlalchemy-c6724a3ff0c88d77431d7e29ed2747eb90953c95.tar.gz |
- query.get() can be used with a mapping to an outer join
where one or more of the primary key values are None.
[ticket:1135]
Diffstat (limited to 'lib/sqlalchemy/sql/util.py')
-rw-r--r-- | lib/sqlalchemy/sql/util.py | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py index d1265c75f..a84a3eb74 100644 --- a/lib/sqlalchemy/sql/util.py +++ b/lib/sqlalchemy/sql/util.py @@ -79,6 +79,24 @@ def find_columns(clause): visitors.traverse(clause, {}, {'column':cols.add}) return cols +def adapt_criterion_to_null(crit, nulls): + """given criterion containing bind params, convert selected elements to IS NULL.""" + + def visit_binary(binary): + if isinstance(binary.left, expression._BindParamClause) and binary.left.key in nulls: + # reverse order if the NULL is on the left side + binary.left = binary.right + binary.right = expression.null() + binary.operator = operators.is_ + binary.negate = operators.isnot + elif isinstance(binary.right, expression._BindParamClause) and binary.right.key in nulls: + binary.right = expression.null() + binary.operator = operators.is_ + binary.negate = operators.isnot + + return visitors.cloned_traverse(crit, {}, {'binary':visit_binary}) + + def join_condition(a, b, ignore_nonexistent_tables=False): """create a join condition between two tables. |