--- /dev/null
+.. change::
+ :tags: bug, schema
+ :tickets: 5298
+
+ Fixed issue where an :class:`.Index` that is deferred in being associated
+ with a table, such as as when it contains a :class:`.Column` that is not
+ associated with any :class:`.Table` yet, would fail to attach correctly if
+ it also contained a non table-oriented expession.
+
cols_w_table = [c for c in col_objs if isinstance(c.table, Table)]
cols_wo_table = set(col_objs).difference(cols_w_table)
-
if cols_wo_table:
# feature #3341 - place event listeners for Column objects
# such that when all those cols are attached, we autoattach.
# issue #3411 - don't do the per-column auto-attach if some of the
# columns are specified as strings.
- has_string_cols = set(self._pending_colargs).difference(col_objs)
+ has_string_cols = set(
+ c for c in self._pending_colargs if c is not None
+ ).difference(col_objs)
if not has_string_cols:
def _col_attached(column, table):
from sqlalchemy import CheckConstraint
from sqlalchemy import Column
from sqlalchemy import ColumnDefault
+from sqlalchemy import desc
from sqlalchemy import Enum
from sqlalchemy import event
from sqlalchemy import exc
idx,
)
+ def test_non_attached_col_plus_string_expr(self):
+ # another one that declarative can lead towards
+ metadata = MetaData()
+
+ t1 = Table("a", metadata, Column("id", Integer))
+
+ c2 = Column("x", Integer)
+
+ # if we do it here, no problem
+ # t1.append_column(c2)
+
+ idx = Index("foo", c2, desc("foo"))
+
+ t1.append_column(c2)
+
+ self._assert_index_col_x(t1, idx, columns=True)
+
def test_column_associated_w_lowercase_table(self):
from sqlalchemy import table