diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-02-16 18:00:41 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-02-16 18:00:41 +0000 |
commit | 1752465211a72c36f3d0404aae3bcda15e693101 (patch) | |
tree | 6ecc791ec9fd2589d4d3e23c7a2e0d85d138ea4b /lib/sqlalchemy/sql/compiler.py | |
parent | bee0b89e2fde7f4545294d6e682fcf2067eb6da5 (diff) | |
download | sqlalchemy-1752465211a72c36f3d0404aae3bcda15e693101.tar.gz |
tighten up conditionals a bit. this method is still doing too much, i.e. the whole pre-visit step is pricey.
Diffstat (limited to 'lib/sqlalchemy/sql/compiler.py')
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 93 |
1 files changed, 51 insertions, 42 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 43c38a1c5..fbe93f6b4 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -782,7 +782,10 @@ class SQLCompiler(engine.Compiled): self.returning = [] # get the keys of explicitly constructed bindparam() objects - bind_names = set(b.key for b in visitors.iterate(stmt, {}) if b.__visit_name__ == 'bindparam') + # TODO: ouch + bind_names = set(b.key for b in visitors.iterate(stmt, {}) + if b.__visit_name__ == 'bindparam') + if stmt.parameters: bind_names.update(stmt.parameters) @@ -821,6 +824,9 @@ class SQLCompiler(engine.Compiled): postfetch_lastrowid = need_pks and self.dialect.postfetch_lastrowid + # iterating through columns at the top to maintain ordering. + # otherwise we might iterate through individual sets of + # "defaults", "primary key cols", etc. for c in stmt.table.columns: if c.key in parameters: value = parameters[c.key] @@ -830,69 +836,72 @@ class SQLCompiler(engine.Compiled): self.postfetch.append(c) value = self.process(value.self_group()) values.append((c, value)) - else: - if self.isinsert: - if c.primary_key and \ - need_pks and \ - ( - not postfetch_lastrowid or - c is not stmt.table._autoincrement_column - ): - - if implicit_returning: - if c.default is not None and c.default.is_sequence: + + elif self.isinsert: + if c.primary_key and \ + need_pks and \ + ( + not postfetch_lastrowid or + c is not stmt.table._autoincrement_column + ): + + if implicit_returning: + if c.default is not None: + if c.default.is_sequence: proc = self.process(c.default) if proc is not None: values.append((c, proc)) self.returning.append(c) - elif c.default is not None and c.default.is_clause_element: + elif c.default.is_clause_element: values.append((c, self.process(c.default.arg.self_group()))) self.returning.append(c) - elif c.default is not None: - values.append((c, self._create_crud_bind_param(c, None))) - self.prefetch.append(c) else: - self.returning.append(c) - else: - if ( - c.default is not None and \ - ( - self.dialect.supports_sequences or - not c.default.is_sequence - ) - ) or self.dialect.preexecute_autoincrement_sequences: - values.append((c, self._create_crud_bind_param(c, None))) self.prefetch.append(c) + else: + self.returning.append(c) + else: + if ( + c.default is not None and \ + ( + self.dialect.supports_sequences or + not c.default.is_sequence + ) + ) or self.dialect.preexecute_autoincrement_sequences: - elif c.default is not None and c.default.is_sequence: + values.append((c, self._create_crud_bind_param(c, None))) + self.prefetch.append(c) + + elif c.default is not None: + if c.default.is_sequence: proc = self.process(c.default) if proc is not None: values.append((c, proc)) if not c.primary_key: self.postfetch.append(c) - elif c.default is not None and c.default.is_clause_element: + elif c.default.is_clause_element: values.append((c, self.process(c.default.arg.self_group()))) - + if not c.primary_key: # dont add primary key column to postfetch self.postfetch.append(c) - elif c.default is not None: + else: values.append((c, self._create_crud_bind_param(c, None))) self.prefetch.append(c) - elif c.server_default is not None: - if not c.primary_key: - self.postfetch.append(c) - elif self.isupdate: - if c.onupdate is not None and not c.onupdate.is_sequence: - if c.onupdate.is_clause_element: - values.append((c, self.process(c.onupdate.arg.self_group()))) - self.postfetch.append(c) - else: - values.append((c, self._create_crud_bind_param(c, None))) - self.prefetch.append(c) - elif c.server_onupdate is not None: + elif c.server_default is not None: + if not c.primary_key: + self.postfetch.append(c) + + elif self.isupdate: + if c.onupdate is not None and not c.onupdate.is_sequence: + if c.onupdate.is_clause_element: + values.append((c, self.process(c.onupdate.arg.self_group()))) self.postfetch.append(c) + else: + values.append((c, self._create_crud_bind_param(c, None))) + self.prefetch.append(c) + elif c.server_onupdate is not None: + self.postfetch.append(c) return values def visit_delete(self, delete_stmt): |