summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-09-01 21:21:29 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-09-01 21:21:29 +0000
commit5df1759e151274594ca4691419f6be7e91257635 (patch)
tree9b0d4feb0811f2320cb15a3c5305449a81845d79 /lib/sqlalchemy
parent61f2ca2c9d708660c45d5e81bfd3337bb82bbe62 (diff)
downloadsqlalchemy-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.py5
-rw-r--r--lib/sqlalchemy/engine/base.py13
-rw-r--r--lib/sqlalchemy/orm/mapper.py2
-rw-r--r--lib/sqlalchemy/sql/compiler.py30
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: