diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-09-01 21:21:29 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-09-01 21:21:29 +0000 |
| commit | 5df1759e151274594ca4691419f6be7e91257635 (patch) | |
| tree | 9b0d4feb0811f2320cb15a3c5305449a81845d79 /lib/sqlalchemy | |
| parent | 61f2ca2c9d708660c45d5e81bfd3337bb82bbe62 (diff) | |
| download | sqlalchemy-5df1759e151274594ca4691419f6be7e91257635.tar.gz | |
- got all examples working
- inline default execution occurs for *all* non-PK columns
unconditionally - preexecute only for non-executemany PK cols on
PG, Oracle, etc.
- new default docs
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/databases/firebird.py | 5 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 13 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 30 |
4 files changed, 26 insertions, 24 deletions
diff --git a/lib/sqlalchemy/databases/firebird.py b/lib/sqlalchemy/databases/firebird.py index a4262d9ca..d520046d0 100644 --- a/lib/sqlalchemy/databases/firebird.py +++ b/lib/sqlalchemy/databases/firebird.py @@ -308,7 +308,10 @@ class FBCompiler(compiler.DefaultCompiler): def uses_sequences_for_inserts(self): return True - + + def visit_sequence(self, seq): + return "gen_id(" + seq.name + ", 1)" + def get_select_precolumns(self, select): """Called when building a ``SELECT`` statement, position is just before column list Firebird puts the limit and offset right diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 6f3badb44..c7364721f 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -392,11 +392,9 @@ class ExecutionContext(object): raise NotImplementedError() def lastrow_has_defaults(self): - """Return True if the last row INSERTED via a compiled insert statement contained PassiveDefaults. + """Return True if the last INSERT or UPDATE row contained + inlined or database-side defaults. - The presence of PassiveDefaults indicates that the database - inserted data beyond that which we passed to the query - programmatically. """ raise NotImplementedError() @@ -1349,7 +1347,14 @@ class ResultProxy(object): """ return self.context.lastrow_has_defaults() + + def postfetch_cols(self): + """Return ``postfetch_cols()`` from the underlying ExecutionContext. + See ExecutionContext for details. + """ + return self.context.postfetch_cols() + def supports_sane_rowcount(self): """Return ``supports_sane_rowcount`` from the dialect. diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 76676e4e5..9ae83460d 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1190,7 +1190,7 @@ class Mapper(object): which will populate those attributes in one query when next accessed. """ - postfetch_cols = resultproxy.context.postfetch_cols().union(util.Set(value_params.keys())) + postfetch_cols = resultproxy.postfetch_cols().union(util.Set(value_params.keys())) deferred_props = [] for c in table.c: diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 617b2468a..7f9d0e31b 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -614,7 +614,7 @@ class DefaultCompiler(engine.Compiled, visitors.ClauseVisitor): return False def visit_sequence(self, seq): - raise NotImplementedError() + return None def visit_insert(self, insert_stmt): @@ -688,32 +688,26 @@ class DefaultCompiler(engine.Compiled, visitors.ClauseVisitor): values.append((c, value)) elif isinstance(c, schema.Column): if self.isinsert: - if isinstance(c.default, schema.ColumnDefault): - if self.inline and isinstance(c.default.arg, sql.ClauseElement): + if c.primary_key and self.uses_sequences_for_inserts() and not self.inline: + values.append((c, create_bind_param(c, None))) + self.prefetch.add(c) + elif isinstance(c.default, schema.ColumnDefault): + if isinstance(c.default.arg, sql.ClauseElement): values.append((c, self.process(c.default.arg))) self.postfetch.add(c) else: values.append((c, create_bind_param(c, None))) self.prefetch.add(c) elif isinstance(c.default, schema.PassiveDefault): - if c.primary_key and self.uses_sequences_for_inserts() and not self.inline: - values.append((c, create_bind_param(c, None))) - self.prefetch.add(c) - else: + self.postfetch.add(c) + elif isinstance(c.default, schema.Sequence): + proc = self.process(c.default) + if proc is not None: + values.append((c, proc)) self.postfetch.add(c) - elif (c.primary_key or isinstance(c.default, schema.Sequence)) and self.uses_sequences_for_inserts(): - if self.inline: - if c.default is not None: - proc = self.process(c.default) - if proc is not None: - values.append((c, proc)) - self.postfetch.add(c) - else: - values.append((c, create_bind_param(c, None))) - self.prefetch.add(c) elif self.isupdate: if isinstance(c.onupdate, schema.ColumnDefault): - if self.inline and isinstance(c.onupdate.arg, sql.ClauseElement): + if isinstance(c.onupdate.arg, sql.ClauseElement): values.append((c, self.process(c.onupdate.arg))) self.postfetch.add(c) else: |
