--- /dev/null
+.. change::
+ :tags: bug, orm
+ :tickets: 9630
+
+ Fixed issue in :func:`_orm.mapped_column` construct where the correct
+ warning for "column X named directly multiple times" would not be emitted
+ when ORM mapped attributes referred to the same :class:`_schema.Column`, if
+ the :func:`_orm.mapped_column` construct were involved, raising an internal
+ assertion instead.
if not isinstance(c, CompositeProperty):
name_to_prop_key[col.name].add(key)
declared_columns.add(col)
- assert col not in column_ordering
+
+ # we would assert this, however we want the below
+ # warning to take effect instead. See #9630
+ # assert col not in column_ordering
+
column_ordering[col] = sort_order
# if this is a MappedColumn and the attribute key we
x = Column("x", Integer)
y = Column("x", Integer)
- def test_column_repeated_under_prop(self):
+ @testing.variation("style", ["old", "new"])
+ def test_column_repeated_under_prop(self, style):
with expect_warnings(
"On class 'Foo', Column object 'x' named directly multiple "
"times, only one will be used: x, y, z. Consider using "
"orm.synonym instead"
), expect_raises(exc.DuplicateColumnError):
+ if style.old:
- class Foo(Base):
- __tablename__ = "foo"
+ class Foo(Base):
+ __tablename__ = "foo"
- id = Column(Integer, primary_key=True)
- x = Column("x", Integer)
- y = column_property(x)
- z = Column("x", Integer)
+ id = Column(Integer, primary_key=True)
+ x = Column("x", Integer)
+ y = column_property(x)
+ z = Column("x", Integer)
+
+ elif style.new:
+
+ class Foo(Base):
+ __tablename__ = "foo"
+
+ id = mapped_column(Integer, primary_key=True)
+ x = mapped_column("x", Integer)
+ y = column_property(x)
+ z = mapped_column("x", Integer)
+
+ else:
+ style.fail()
def test_using_explicit_prop_in_schema_objects(self):
class Foo(Base):