From 25e7dc60dfa739692421a9576c83f2db29f73cb2 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 10 May 2010 11:37:48 -0400 Subject: [PATCH] - the _make_proxy() method of ColumnClause and Column now use self.__class__ to determine the class of object to be returned instead of hardcoding to ColumnClause/Column, making it slightly easier to produce specific subclasses of these which work in alias/subquery situations. --- CHANGES | 8 +++++++- lib/sqlalchemy/schema.py | 2 +- lib/sqlalchemy/sql/expression.py | 14 +++++++++++++- lib/sqlalchemy/sql/util.py | 4 ++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 39326b491f..3438fab4f6 100644 --- a/CHANGES +++ b/CHANGES @@ -31,7 +31,13 @@ CHANGES - Fixed bug in connection pool cursor wrapper whereby if a cursor threw an exception on close(), the logging of the message would fail. [ticket:1786] - + + - the _make_proxy() method of ColumnClause and Column now use + self.__class__ to determine the class of object to be returned + instead of hardcoding to ColumnClause/Column, making it slightly + easier to produce specific subclasses of these which work in + alias/subquery situations. + - engines - Fixed building the C extensions on Python 2.4. [ticket:1781] diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 7a12891804..168296db61 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -855,7 +855,7 @@ class Column(SchemaItem, expression.ColumnClause): """ fk = [ForeignKey(f.column) for f in self.foreign_keys] - c = Column( + c = self._constructor( name or self.name, self.type, key = name or self.key, diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 440c118333..9ac5c1d66d 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -1037,6 +1037,18 @@ class ClauseElement(Visitable): return c + @property + def _constructor(self): + """return the 'constructor' for this ClauseElement. + + This is for the purposes for creating a new object of + this type. Usually, its just the element's __class__. + However, the "Annotated" version of the object overrides + to return the class of its proxied element. + + """ + return self.__class__ + @util.memoized_property def _cloned_set(self): """Return the set consisting all cloned anscestors of this @@ -3244,7 +3256,7 @@ class ColumnClause(_Immutable, ColumnElement): # propagate the "is_literal" flag only if we are keeping our name, # otherwise its considered to be a label is_literal = self.is_literal and (name is None or name == self.name) - c = ColumnClause( + c = self._constructor( name or self.name, selectable=selectable, type_=self.type, diff --git a/lib/sqlalchemy/sql/util.py b/lib/sqlalchemy/sql/util.py index b81906396f..e4ebe95384 100644 --- a/lib/sqlalchemy/sql/util.py +++ b/lib/sqlalchemy/sql/util.py @@ -265,6 +265,10 @@ class Annotated(object): def _deannotate(self): return self.__element + + @property + def _constructor(self): + return self.__element.__class__ def _clone(self): clone = self.__element._clone() -- 2.47.2