From: Mike Bayer Date: Fri, 2 Sep 2016 15:48:15 +0000 (-0400) Subject: Allow stringify compiler to render unnamed column X-Git-Tag: rel_1_1_0~36^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a6947427af58eeb6ebf09ec6de2a1b7ec12d828;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Allow stringify compiler to render unnamed column Stringify of expression with unnamed :class:`.Column` objects, as occurs in lots of situations including ORM error reporting, will now render the name in string context as "" rather than raising a compile error. Change-Id: I76f637c5eb4cfdb1b526964cb001565b97e296da Fixes: #3789 --- diff --git a/doc/build/changelog/changelog_11.rst b/doc/build/changelog/changelog_11.rst index 88f1ebb244..c038966c5d 100644 --- a/doc/build/changelog/changelog_11.rst +++ b/doc/build/changelog/changelog_11.rst @@ -21,6 +21,15 @@ .. changelog:: :version: 1.1.0 + .. change:: + :tags: bug, sql + :tickets: 3789 + + Stringify of expression with unnamed :class:`.Column` objects, as + occurs in lots of situations including ORM error reporting, + will now render the name in string context as "" + rather than raising a compile error. + .. change:: :tags: bug, sql :tickets: 3786 diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 85d5ff6da8..a7954f10a2 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -660,12 +660,15 @@ class SQLCompiler(Compiled): return label.element._compiler_dispatch( self, within_columns_clause=False, **kw) + def _fallback_column_name(self, column): + raise exc.CompileError("Cannot compile Column object until " + "its 'name' is assigned.") + def visit_column(self, column, add_to_result_map=None, include_table=True, **kwargs): name = orig_name = column.name if name is None: - raise exc.CompileError("Cannot compile Column object until " - "its 'name' is assigned.") + name = self._fallback_column_name(column) is_literal = column.is_literal if not is_literal and isinstance(name, elements._truncated_label): @@ -2203,6 +2206,9 @@ class StrSQLCompiler(SQLCompiler): """ + def _fallback_column_name(self, column): + return "" + def visit_getitem_binary(self, binary, operator, **kw): return "%s[%s]" % ( self.process(binary.left, **kw), @@ -2210,7 +2216,6 @@ class StrSQLCompiler(SQLCompiler): ) def returning_clause(self, stmt, returning_cols): - columns = [ self._label_select_column(None, c, True, False, {}) for c in elements._select_iterables(returning_cols) diff --git a/test/sql/test_compiler.py b/test/sql/test_compiler.py index a0db9864ec..6896c98578 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -2432,14 +2432,16 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL): assert_raises_message( exc.CompileError, "Cannot compile Column object until its 'name' is assigned.", - str, sel2 + sel2.compile, + dialect=default.DefaultDialect() ) sel3 = select([my_str]).as_scalar() assert_raises_message( exc.CompileError, "Cannot compile Column object until its 'name' is assigned.", - str, sel3 + sel3.compile, + dialect=default.DefaultDialect() ) my_str.name = 'foo' @@ -2709,6 +2711,13 @@ class StringifySpecialTest(fixtures.TestBase): "FROM mytable WHERE mytable.myid = :myid_1" ) + def test_unnamed_column(self): + stmt = Column(Integer) == 5 + eq_ignore_whitespace( + str(stmt), + '"" = :param_1' + ) + def test_cte(self): # stringify of these was supported anyway by defaultdialect. stmt = select([table1.c.myid]).cte()