diff options
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r-- | lib/sqlalchemy/ansisql.py | 3 | ||||
-rw-r--r-- | lib/sqlalchemy/databases/oracle.py | 8 | ||||
-rw-r--r-- | lib/sqlalchemy/engine.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/mapper.py | 17 | ||||
-rw-r--r-- | lib/sqlalchemy/sql.py | 13 |
5 files changed, 26 insertions, 17 deletions
diff --git a/lib/sqlalchemy/ansisql.py b/lib/sqlalchemy/ansisql.py index dac1b0e76..e269e7efd 100644 --- a/lib/sqlalchemy/ansisql.py +++ b/lib/sqlalchemy/ansisql.py @@ -190,7 +190,8 @@ class ANSICompiler(sql.Compiled): else: self.froms[join] = (self.get_from_text(join.left) + " JOIN " + self.get_from_text(join.right) + " ON " + self.get_str(join.onclause)) - + + def visit_insert(self, insert_stmt): colparams = insert_stmt.get_colparams(self.bindparams) diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 861b80b0e..7f76fa2d6 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -32,8 +32,8 @@ class OracleSQLEngine(ansisql.ANSISQLEngine): self._use_ansi = use_ansi ansisql.ANSISQLEngine.__init__(self, **params) - def compile(self, statement): - compiler = OracleCompiler(statement, use_ansi = self._use_ansi) + def compile(self, statement, bindparams = None): + compiler = OracleCompiler(statement, bindparams, use_ansi = self._use_ansi) statement.accept_visitor(compiler) return compiler @@ -45,10 +45,10 @@ class OracleCompiler(ansisql.ANSICompiler): """oracle compiler modifies the lexical structure of Select statements to work under non-ANSI configured Oracle databases, if the use_ansi flag is False.""" - def __init__(self, parent, use_ansi = True): + def __init__(self, parent, bindparams, use_ansi = True): self._outertable = None self._use_ansi = use_ansi - ansisql.ANSICompiler.__init__(self, parent) + ansisql.ANSICompiler.__init__(self, parent, bindparams) def visit_join(self, join): if self._use_ansi: diff --git a/lib/sqlalchemy/engine.py b/lib/sqlalchemy/engine.py index b81e6c3d0..0814caf57 100644 --- a/lib/sqlalchemy/engine.py +++ b/lib/sqlalchemy/engine.py @@ -71,7 +71,7 @@ class SQLEngine(schema.SchemaEngine): def dbapi(self): raise NotImplementedError() - def compile(self, statement): + def compile(self, statement, bindparams): raise NotImplementedError() def proxy(self): diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index 2e8252aa5..36f131745 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -102,8 +102,8 @@ class Mapper(object): def _select_whereclause(self, whereclause = None, **params): statement = sql.select([self.table], whereclause) - for value in self.props.values(): - value.setup(self.table, statement) + for key, value in self.props.iteritems(): + value.setup(key, self.table, statement) return self._select_statement(statement, **params) def _select_statement(self, statement, **params): @@ -123,7 +123,7 @@ class Mapper(object): class MapperProperty: def execute(self, instance, key, row, isduplicate): raise NotImplementedError() - def setup(self, primarytable, statement): + def setup(self, key, primarytable, statement): pass class ColumnProperty(MapperProperty): @@ -138,13 +138,14 @@ class EagerLoader(MapperProperty): def __init__(self, mapper, whereclause): self.mapper = mapper self.whereclause = whereclause - def setup(self, primarytable, statement): + def setup(self, key, primarytable, statement): + targettable = self.mapper.table if hasattr(statement, '_outerjoin'): - statement._outerjoin.right = sql.outerjoin(primarytable, self.mapper.table, self.whereclause) + statement._outerjoin = sql.outerjoin(statement._outerjoin, targettable, self.whereclause) else: - statement._outerjoin = sql.outerjoin(primarytable, self.mapper.table, self.whereclause) - statement.append_from(statement._outerjoin) - statement.append_column(self.mapper.table) + statement._outerjoin = sql.outerjoin(primarytable, targettable, self.whereclause) + statement.append_from(statement._outerjoin) + statement.append_column(targettable) def execute(self, instance, key, row, isduplicate): try: list = getattr(instance, key) diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 2d9d26e95..071a6185c 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -279,6 +279,9 @@ class Join(Selectable): self.onclause = onclause self.isouter = isouter + def add_join(self, join): + pass + def select(self, whereclauses = None, **params): return select([self.left, self.right], and_(self.onclause, whereclauses), **params) @@ -287,13 +290,15 @@ class Join(Selectable): self.right.accept_visitor(visitor) self.onclause.accept_visitor(visitor) visitor.visit_join(self) - + def _engine(self): return self.left._engine() or self.right._engine() def _get_from_objects(self): - return [self, FromClause(from_key = self.left.id), FromClause(from_key = self.right.id)] - + result = [self] + [FromClause(from_key = c.id) for c in self.left._get_from_objects() + self.right._get_from_objects()] + print repr([c.id for c in result]) + return result + class Alias(Selectable): def __init__(self, selectable, alias): self.selectable = selectable @@ -304,6 +309,8 @@ class Alias(Selectable): for co in selectable.columns: co._make_proxy(self) + primary_keys = property (lambda self: [c for c in self.columns if c.primary_key]) + def accept_visitor(self, visitor): self.selectable.accept_visitor(visitor) visitor.visit_alias(self) |