summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-10-08 14:41:35 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2012-10-08 14:41:35 -0400
commit0a6e2d9b3683cf198b7a5bcf34a7abfb1f6ca19a (patch)
tree37b5fa31ac38e5e3322272f3ef901d9a5fee423d
parentab59e3e1135e1c5b59d19a54114163119d5ab1a4 (diff)
downloadsqlalchemy-0a6e2d9b3683cf198b7a5bcf34a7abfb1f6ca19a.tar.gz
- [feature] Various API tweaks to the "dialect"
API to better support highly specialized systems such as the Akiban database, including more hooks to allow an execution context to access type processors.
-rw-r--r--CHANGES6
-rw-r--r--lib/sqlalchemy/engine/default.py10
-rw-r--r--lib/sqlalchemy/engine/result.py2
-rw-r--r--lib/sqlalchemy/sql/compiler.py9
-rw-r--r--lib/sqlalchemy/testing/plugin/noseplugin.py22
5 files changed, 39 insertions, 10 deletions
diff --git a/CHANGES b/CHANGES
index 33bf4107c..af63a0960 100644
--- a/CHANGES
+++ b/CHANGES
@@ -423,6 +423,12 @@ underneath "0.7.xx".
collection of bound parameters, rather than
implicitly assigning None. [ticket:2556]
+ - [feature] Various API tweaks to the "dialect"
+ API to better support highly specialized
+ systems such as the Akiban database, including
+ more hooks to allow an execution context to
+ access type processors.
+
- [bug] The names of the columns on the
.c. attribute of a select().apply_labels()
is now based on <tablename>_<colkey> instead
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py
index 21e02fcdc..f43c0404e 100644
--- a/lib/sqlalchemy/engine/default.py
+++ b/lib/sqlalchemy/engine/default.py
@@ -625,6 +625,16 @@ class DefaultExecutionContext(interfaces.ExecutionContext):
def post_exec(self):
pass
+ def get_result_processor(self, type_, colname, coltype):
+ """Return a 'result processor' for a given type as present in
+ cursor.description.
+
+ This has a default implementation that dialects can override
+ for context-sensitive result type handling.
+
+ """
+ return type_._cached_result_processor(self.dialect, coltype)
+
def get_lastrowid(self):
"""return self.cursor.lastrowid, or equivalent, after an INSERT.
diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py
index bf6410f15..9fb735f46 100644
--- a/lib/sqlalchemy/engine/result.py
+++ b/lib/sqlalchemy/engine/result.py
@@ -210,7 +210,7 @@ class ResultMetaData(object):
name, obj, type_ = \
colname, None, typemap.get(coltype, types.NULLTYPE)
- processor = type_._cached_result_processor(dialect, coltype)
+ processor = context.get_result_processor(type_, colname, coltype)
processors.append(processor)
rec = (processor, obj, i)
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py
index d3a4a64a2..cc41e6182 100644
--- a/lib/sqlalchemy/sql/compiler.py
+++ b/lib/sqlalchemy/sql/compiler.py
@@ -1068,6 +1068,7 @@ class SQLCompiler(engine.Compiled):
def visit_select(self, select, asfrom=False, parens=True,
iswrapper=False, fromhints=None,
compound_index=0,
+ force_result_map=False,
positional_names=None, **kwargs):
entry = self.stack and self.stack[-1] or {}
@@ -1082,9 +1083,11 @@ class SQLCompiler(engine.Compiled):
# to outermost if existingfroms: correlate_froms =
# correlate_froms.union(existingfroms)
- populate_result_map = compound_index == 0 and (
- not entry or \
- entry.get('iswrapper', False)
+ populate_result_map = force_result_map or (
+ compound_index == 0 and (
+ not entry or \
+ entry.get('iswrapper', False)
+ )
)
self.stack.append({'from': correlate_froms,
diff --git a/lib/sqlalchemy/testing/plugin/noseplugin.py b/lib/sqlalchemy/testing/plugin/noseplugin.py
index 0dcd45825..1651886b8 100644
--- a/lib/sqlalchemy/testing/plugin/noseplugin.py
+++ b/lib/sqlalchemy/testing/plugin/noseplugin.py
@@ -158,13 +158,23 @@ def _prep_testing_database(options, file_config):
e = engines.utf8_engine()
inspector = inspect(e)
- for vname in inspector.get_view_names():
- e.execute(schema._DropView(schema.Table(vname, schema.MetaData())))
+ try:
+ view_names = inspector.get_view_names()
+ except NotImplementedError:
+ pass
+ else:
+ for vname in view_names:
+ e.execute(schema._DropView(schema.Table(vname, schema.MetaData())))
- for vname in inspector.get_view_names(schema="test_schema"):
- e.execute(schema._DropView(
- schema.Table(vname,
- schema.MetaData(), schema="test_schema")))
+ try:
+ view_names = inspector.get_view_names(schema="test_schema")
+ except NotImplementedError:
+ pass
+ else:
+ for vname in view_names:
+ e.execute(schema._DropView(
+ schema.Table(vname,
+ schema.MetaData(), schema="test_schema")))
for tname in reversed(inspector.get_table_names(order_by="foreign_key")):
e.execute(schema.DropTable(schema.Table(tname, schema.MetaData())))