summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/ansisql.py3
-rw-r--r--lib/sqlalchemy/databases/oracle.py8
-rw-r--r--lib/sqlalchemy/engine.py2
-rw-r--r--lib/sqlalchemy/mapper.py17
-rw-r--r--lib/sqlalchemy/sql.py13
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)