summaryrefslogtreecommitdiff
path: root/test/orm/declarative/test_inheritance.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/declarative/test_inheritance.py')
-rw-r--r--test/orm/declarative/test_inheritance.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/test/orm/declarative/test_inheritance.py b/test/orm/declarative/test_inheritance.py
index e8658926b..333d24230 100644
--- a/test/orm/declarative/test_inheritance.py
+++ b/test/orm/declarative/test_inheritance.py
@@ -1,3 +1,5 @@
+import contextlib
+
import sqlalchemy as sa
from sqlalchemy import ForeignKey
from sqlalchemy import Identity
@@ -7,6 +9,7 @@ from sqlalchemy import String
from sqlalchemy import testing
from sqlalchemy.orm import class_mapper
from sqlalchemy.orm import close_all_sessions
+from sqlalchemy.orm import column_property
from sqlalchemy.orm import configure_mappers
from sqlalchemy.orm import declared_attr
from sqlalchemy.orm import deferred
@@ -20,6 +23,7 @@ from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
from sqlalchemy.testing import eq_
from sqlalchemy.testing import expect_raises_message
+from sqlalchemy.testing import expect_warnings
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
from sqlalchemy.testing import is_false
@@ -987,6 +991,98 @@ class DeclarativeInheritanceTest(
session.commit()
eq_(session.query(Engineer).first().target, o1)
+ @testing.variation("omit_from_statements", [True, False])
+ @testing.variation("combine_on_b", [True, False])
+ @testing.variation("c_first", [True, False])
+ def test_use_existing_column_other_inh_types(
+ self, decl_base, omit_from_statements, combine_on_b, c_first
+ ):
+ """test additional fixes to use_existing_column, adding
+ some new use cases with "omit_from_statements" which in this case
+ is essentially the same as adding it to the mapper exclude_cols
+ list.
+
+ """
+
+ class A(decl_base):
+ __tablename__ = "a"
+
+ id: Mapped[int] = mapped_column(primary_key=True)
+ data: Mapped[str]
+ extra: Mapped[int] = mapped_column(
+ use_existing_column=True,
+ _omit_from_statements=bool(omit_from_statements),
+ )
+
+ if c_first:
+
+ class C(A):
+ foo: Mapped[str]
+ extra: Mapped[int] = mapped_column(
+ use_existing_column=True,
+ _omit_from_statements=bool(omit_from_statements),
+ )
+
+ if not combine_on_b and not omit_from_statements:
+ ctx = expect_warnings(
+ "Implicitly combining column a.extra with column b.extra",
+ raise_on_any_unexpected=True,
+ )
+ else:
+ ctx = contextlib.nullcontext()
+
+ with ctx:
+
+ class B(A):
+ __tablename__ = "b"
+ id: Mapped[int] = mapped_column(
+ ForeignKey("a.id"), primary_key=True
+ )
+ if combine_on_b:
+ extra: Mapped[int] = column_property(
+ mapped_column(
+ _omit_from_statements=bool(omit_from_statements)
+ ),
+ A.extra,
+ )
+ else:
+ extra: Mapped[int] = mapped_column(
+ use_existing_column=True,
+ _omit_from_statements=bool(omit_from_statements),
+ )
+
+ if not c_first:
+
+ class C(A): # noqa: F811
+ foo: Mapped[str]
+ extra: Mapped[int] = mapped_column(
+ use_existing_column=True,
+ _omit_from_statements=bool(omit_from_statements),
+ )
+
+ if bool(omit_from_statements):
+ self.assert_compile(select(A), "SELECT a.id, a.data FROM a")
+ else:
+ self.assert_compile(
+ select(A), "SELECT a.id, a.data, a.extra FROM a"
+ )
+
+ if bool(omit_from_statements) and not combine_on_b:
+ self.assert_compile(
+ select(B),
+ "SELECT b.id, a.id AS id_1, a.data "
+ "FROM a JOIN b ON a.id = b.id",
+ )
+ else:
+ # if we combine_on_b we made a column_property, which brought
+ # out "extra" even if it was omit_from_statements. this should be
+ # expected
+ self.assert_compile(
+ select(B),
+ "SELECT b.id, a.id AS id_1, a.data, b.extra, "
+ "a.extra AS extra_1 FROM a JOIN b ON a.id = b.id",
+ )
+
@testing.variation("decl_type", ["legacy", "use_existing_column"])
def test_columns_single_inheritance_conflict_resolution_pk(
self, decl_base, decl_type