From: Mike Bayer Date: Tue, 13 Jan 2009 15:38:38 +0000 (+0000) Subject: - Column with no name (as in declarative) won't raise a X-Git-Tag: rel_0_5_1~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b99bdc7cee1080e6fd86451c5def2410a697c0b9;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Column with no name (as in declarative) won't raise a NoneType error when it's string output is requsted (such as in a stack trace). --- diff --git a/CHANGES b/CHANGES index 409e25340f..7904085650 100644 --- a/CHANGES +++ b/CHANGES @@ -51,6 +51,10 @@ CHANGES (i.e. column-based mapped class attributes) as column arguments. [ticket:1214] + - Column with no name (as in declarative) won't raise a + NoneType error when it's string output is requsted + (such as in a stack trace). + - declarative - Can now specify Column objects on subclasses which have no table of their own (i.e. use single table inheritance). diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index a5cb6e9d2d..70f50622d7 100644 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -737,3 +737,4 @@ def _undefer_column_name(key, column): column.key = key if column.name is None: column.name = key + util.reset_memoized(column, 'description') \ No newline at end of file diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index b8a36ebb5a..792a7e9239 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -617,9 +617,16 @@ class Column(SchemaItem, expression.ColumnClause): else: return self.description + @util.memoized_property + def description(self): + if not self.name: + return "(no name)" + else: + return self.name.encode('ascii', 'backslashreplace') + + @property def bind(self): return self.table.bind - bind = property(bind) def references(self, column): """Return True if this Column references the given column via foreign key.""" diff --git a/test/ext/declarative.py b/test/ext/declarative.py index 3176832f30..71505e48f5 100644 --- a/test/ext/declarative.py +++ b/test/ext/declarative.py @@ -63,6 +63,18 @@ class DeclarativeTest(DeclarativeTestBase): class User(Base): id = Column('id', Integer, primary_key=True) self.assertRaisesMessage(sa.exc.InvalidRequestError, "does not have a __table__", go) + + def test_undefer_column_name(self): + # TODO: not sure if there was an explicit + # test for this elsewhere + foo = Column(Integer) + eq_(str(foo), '(no name)') + eq_(foo.key, None) + eq_(foo.name, None) + decl._undefer_column_name('foo', foo) + eq_(str(foo), 'foo') + eq_(foo.key, 'foo') + eq_(foo.name, 'foo') def test_recompile_on_othermapper(self): """declarative version of the same test in mappers.py"""