summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2023-05-09 11:33:30 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2023-05-09 11:34:17 -0400
commit4e3806861b19a00203f95b6ecbe411a4e252d152 (patch)
tree7270372745caeed7f7b55d7ae358b42f53a29c6b
parent946e71efdfc93777027f4fd7360a524051be393d (diff)
downloadsqlalchemy-4e3806861b19a00203f95b6ecbe411a4e252d152.tar.gz
allow column named twice warning to take effect
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. Fixes: #9630 Change-Id: I5d9dfaaa225aefb487c9cd981ba3ad78507bb577
-rw-r--r--doc/build/changelog/unreleased_20/9630.rst9
-rw-r--r--lib/sqlalchemy/orm/decl_base.py6
-rw-r--r--test/orm/declarative/test_basic.py29
3 files changed, 36 insertions, 8 deletions
diff --git a/doc/build/changelog/unreleased_20/9630.rst b/doc/build/changelog/unreleased_20/9630.rst
new file mode 100644
index 000000000..912cb5795
--- /dev/null
+++ b/doc/build/changelog/unreleased_20/9630.rst
@@ -0,0 +1,9 @@
+.. 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.
diff --git a/lib/sqlalchemy/orm/decl_base.py b/lib/sqlalchemy/orm/decl_base.py
index b7d6dd8cf..71b93de8f 100644
--- a/lib/sqlalchemy/orm/decl_base.py
+++ b/lib/sqlalchemy/orm/decl_base.py
@@ -1646,7 +1646,11 @@ class _ClassScanMapperConfig(_MapperConfig):
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
diff --git a/test/orm/declarative/test_basic.py b/test/orm/declarative/test_basic.py
index d0e56819c..2ccbc19f1 100644
--- a/test/orm/declarative/test_basic.py
+++ b/test/orm/declarative/test_basic.py
@@ -1419,20 +1419,35 @@ class DeclarativeMultiBaseTest(
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):