diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-03-24 17:43:06 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-03-24 23:28:20 -0400 |
| commit | 346e2bc0a64f5d451d951d04a7ee36b1dd7ea8fa (patch) | |
| tree | 36f8659b2164bb646e38e5da9e05de44a580649f /test | |
| parent | 218177c4d60c5c4ab0524a0ab347e1c711458e3c (diff) | |
| download | sqlalchemy-346e2bc0a64f5d451d951d04a7ee36b1dd7ea8fa.tar.gz | |
Use class-local metadata for declarative base
Fixed regression where the ``.metadata`` attribute on a per class level
would not be honored, breaking the use case of per-class-hierarchy
:class:`.schema.MetaData` for abstract declarative classes and mixins.
Fixes: #6128
Change-Id: I5c15436b5c5171105dc1a0192fa744daf79a344d
Diffstat (limited to 'test')
| -rw-r--r-- | test/aaa_profiling/test_memusage.py | 2 | ||||
| -rw-r--r-- | test/orm/declarative/test_mixin.py | 98 | ||||
| -rw-r--r-- | test/requirements.py | 7 |
3 files changed, 106 insertions, 1 deletions
diff --git a/test/aaa_profiling/test_memusage.py b/test/aaa_profiling/test_memusage.py index b1dd29a7e..d8896a3d6 100644 --- a/test/aaa_profiling/test_memusage.py +++ b/test/aaa_profiling/test_memusage.py @@ -341,7 +341,7 @@ class MemUsageTest(EnsureZeroed): class MemUsageWBackendTest(EnsureZeroed): __tags__ = ("memory_intensive",) - __requires__ = "cpython", "memory_process_intensive" + __requires__ = "cpython", "memory_process_intensive", "no_asyncio" __sparse_backend__ = True # ensure a pure growing test trips the assertion diff --git a/test/orm/declarative/test_mixin.py b/test/orm/declarative/test_mixin.py index ad4832c35..05628641a 100644 --- a/test/orm/declarative/test_mixin.py +++ b/test/orm/declarative/test_mixin.py @@ -243,6 +243,104 @@ class DeclarativeMixinTest(DeclarativeTestBase): eq_(Manager.__table__.name, "manager") + def test_same_base_multiple_metadata(self): + m1 = MetaData() + m2 = MetaData() + + class B1(Base): + __abstract__ = True + metadata = m1 + + class B2(Base): + __abstract__ = True + metadata = m2 + + def fullname(self): + return self.name + " " + self.surname + + class User(B1): + __tablename__ = "user" + + id = Column(Integer, primary_key=True) + name = Column(String) + surname = Column(String) + + class AD(B1): + __tablename__ = "address" + + id = Column(Integer, primary_key=True) + + class OtherUser(B2): + __tablename__ = "user" + + id = Column(Integer, primary_key=True) + username = Column(String) + + class BUser(Base): + __tablename__ = "user" + + id = Column(Integer, primary_key=True) + login = Column(String) + + eq_(set(m1.tables), {"user", "address"}) + eq_(set(m2.tables), {"user"}) + eq_(set(Base.registry.metadata.tables), {"user"}) + + eq_(Base.registry.metadata.tables["user"].c.keys(), ["id", "login"]) + eq_(m1.tables["user"].c.keys(), ["id", "name", "surname"]) + eq_(m2.tables["user"].c.keys(), ["id", "username"]) + + def test_same_registry_multiple_metadata(self): + m1 = MetaData() + m2 = MetaData() + + reg = registry() + + class B1(object): + metadata = m1 + + class B2(object): + metadata = m2 + + def fullname(self): + return self.name + " " + self.surname + + @reg.mapped + class User(B1): + __tablename__ = "user" + + id = Column(Integer, primary_key=True) + name = Column(String) + surname = Column(String) + + @reg.mapped + class AD(B1): + __tablename__ = "address" + + id = Column(Integer, primary_key=True) + + @reg.mapped + class OtherUser(B2): + __tablename__ = "user" + + id = Column(Integer, primary_key=True) + username = Column(String) + + @reg.mapped + class BUser(object): + __tablename__ = "user" + + id = Column(Integer, primary_key=True) + login = Column(String) + + eq_(set(m1.tables), {"user", "address"}) + eq_(set(m2.tables), {"user"}) + eq_(set(reg.metadata.tables), {"user"}) + + eq_(reg.metadata.tables["user"].c.keys(), ["id", "login"]) + eq_(m1.tables["user"].c.keys(), ["id", "name", "surname"]) + eq_(m2.tables["user"].c.keys(), ["id", "username"]) + def test_not_allowed(self): class MyMixin: foo = Column(Integer, ForeignKey("bar.id")) diff --git a/test/requirements.py b/test/requirements.py index df4a3b601..27bf17c0a 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -1458,6 +1458,13 @@ class DefaultRequirements(SuiteRequirements): ) @property + def no_asyncio(self): + def go(config): + return config.db.dialect.is_async + + return skip_if(go) + + @property def no_mssql_freetds(self): return self.mssql_freetds.not_() |
