from sqlalchemy import sql, util, exceptions
from sqlalchemy.sql import util as sql_util
+from sqlalchemy.sql.util import row_adapter as create_row_adapter
from sqlalchemy.sql import visitors
from sqlalchemy.orm.interfaces import MapperExtension, EXT_CONTINUE, build_path
"""
return create_row_adapter(self.alias, self.mapped_table)
-def create_row_adapter(from_, to, equivalent_columns=None):
- """create a row adapter between two selectables.
-
- The returned adapter is a class that can be instantiated repeatedly for any number
- of rows; this is an inexpensive process. However, the creation of the row
- adapter class itself *is* fairly expensive so caching should be used to prevent
- repeated calls to this function.
- """
-
- map = {}
- for c in to.c:
- corr = from_.corresponding_column(c)
- if corr:
- map[c] = corr
- elif equivalent_columns:
- if c in equivalent_columns:
- for c2 in equivalent_columns[c]:
- corr = from_.corresponding_column(c2)
- if corr:
- map[c] = corr
- break
-
- class AliasedRow(object):
- def __init__(self, row):
- self.row = row
- def __contains__(self, key):
- if key in map:
- return map[key] in self.row
- else:
- return key in self.row
- def has_key(self, key):
- return key in self
- def __getitem__(self, key):
- if key in map:
- key = map[key]
- return self.row[key]
- def keys(self):
- return map.keys()
- AliasedRow.map = map
- return AliasedRow
class PropertyAliasedClauses(AliasedClauses):
"""extends AliasedClauses to add support for primary/secondary joins on a relation()."""
return expression.ColumnSet(columns.difference(omit))
+def row_adapter(from_, to, equivalent_columns=None):
+ """create a row adapter between two selectables.
+
+ The returned adapter is a class that can be instantiated repeatedly for any number
+ of rows; this is an inexpensive process. However, the creation of the row
+ adapter class itself *is* fairly expensive so caching should be used to prevent
+ repeated calls to this function.
+ """
+
+ map = {}
+ for c in to.c:
+ corr = from_.corresponding_column(c)
+ if corr:
+ map[c] = corr
+ elif equivalent_columns:
+ if c in equivalent_columns:
+ for c2 in equivalent_columns[c]:
+ corr = from_.corresponding_column(c2)
+ if corr:
+ map[c] = corr
+ break
+
+ class AliasedRow(object):
+ def __init__(self, row):
+ self.row = row
+ def __contains__(self, key):
+ if key in map:
+ return map[key] in self.row
+ else:
+ return key in self.row
+ def has_key(self, key):
+ return key in self
+ def __getitem__(self, key):
+ if key in map:
+ key = map[key]
+ return self.row[key]
+ def keys(self):
+ return map.keys()
+ AliasedRow.map = map
+ return AliasedRow
+
class ColumnsInClause(visitors.ClauseVisitor):
"""Given a selectable, visit clauses and determine if any columns
from the clause are in the selectable.