From: Mike Bayer Date: Wed, 29 Sep 2021 19:07:36 +0000 (-0400) Subject: remove declarative warnings X-Git-Tag: rel_1_4_26~53^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f59f693d44060f5f777d36c5163785b91d91b2aa;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git remove declarative warnings * sqlalchemy.ext.declarative names * declarative_base(bind) Change-Id: I0ca26894b224458b58e46504c5ff7b5d3031a829 --- diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py index d367e7dc3c..22b85f398d 100644 --- a/lib/sqlalchemy/testing/suite/test_types.py +++ b/lib/sqlalchemy/testing/suite/test_types.py @@ -39,7 +39,7 @@ from ... import TypeDecorator from ... import Unicode from ... import UnicodeText from ... import util -from ...ext.declarative import declarative_base +from ...orm import declarative_base from ...orm import Session from ...util import u diff --git a/lib/sqlalchemy/testing/warnings.py b/lib/sqlalchemy/testing/warnings.py index d22fb175ec..f72d53d676 100644 --- a/lib/sqlalchemy/testing/warnings.py +++ b/lib/sqlalchemy/testing/warnings.py @@ -70,10 +70,6 @@ def setup_filters(): # r"Calling the mapper\(\) function directly outside of a " "declarative registry", - r"The ``declarative_base\(\)`` function is now available ", - r"The ``has_inherited_table\(\)`` function is now available", - r"The ``bind`` argument to declarative_base is deprecated and will " - "be removed in SQLAlchemy 2.0.", # # ORM Query # diff --git a/test/aaa_profiling/test_memusage.py b/test/aaa_profiling/test_memusage.py index 1c08c30a24..d196793a40 100644 --- a/test/aaa_profiling/test_memusage.py +++ b/test/aaa_profiling/test_memusage.py @@ -19,6 +19,7 @@ from sqlalchemy.orm import aliased from sqlalchemy.orm import clear_mappers from sqlalchemy.orm import configure_mappers from sqlalchemy.orm import create_session +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import join as orm_join from sqlalchemy.orm import joinedload from sqlalchemy.orm import Load @@ -1609,8 +1610,6 @@ class CycleTest(_fixtures.FixtureTest): @testing.provide_metadata def test_optimized_get(self): - from sqlalchemy.ext.declarative import declarative_base - Base = declarative_base(metadata=self.metadata) class Employee(Base): diff --git a/test/dialect/postgresql/test_types.py b/test/dialect/postgresql/test_types.py index 1b527df2ce..bb8e44876f 100644 --- a/test/dialect/postgresql/test_types.py +++ b/test/dialect/postgresql/test_types.py @@ -45,7 +45,7 @@ from sqlalchemy.dialects.postgresql import NUMRANGE from sqlalchemy.dialects.postgresql import TSRANGE from sqlalchemy.dialects.postgresql import TSTZRANGE from sqlalchemy.exc import CompileError -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import Session from sqlalchemy.sql import operators from sqlalchemy.sql import sqltypes diff --git a/test/ext/declarative/test_deprecations.py b/test/ext/declarative/test_deprecations.py index f2055541a3..130c127389 100644 --- a/test/ext/declarative/test_deprecations.py +++ b/test/ext/declarative/test_deprecations.py @@ -1,9 +1,13 @@ import sqlalchemy as sa +from sqlalchemy import inspect +from sqlalchemy.ext import declarative as legacy_decl from sqlalchemy.ext.declarative import instrument_declarative from sqlalchemy.orm import Mapper +from sqlalchemy.testing import eq_ from sqlalchemy.testing import expect_deprecated_20 from sqlalchemy.testing import fixtures from sqlalchemy.testing import is_ +from sqlalchemy.testing import is_false from sqlalchemy.testing import is_true @@ -23,3 +27,67 @@ class TestInstrumentDeclarative(fixtures.TestBase): mapper = sa.inspect(Foo) is_true(isinstance(mapper, Mapper)) is_(mapper.class_, Foo) + + +class DeprecatedImportsTest(fixtures.TestBase): + def _expect_warning(self, name): + return expect_deprecated_20( + r"The ``%s\(\)`` function is now available as " + r"sqlalchemy.orm.%s\(\)" % (name, name) + ) + + def test_declarative_base(self): + with self._expect_warning("declarative_base"): + Base = legacy_decl.declarative_base() + + class Foo(Base): + __tablename__ = "foo" + id = sa.Column(sa.Integer, primary_key=True) + + assert inspect(Foo).mapper + + def test_as_declarative(self): + with self._expect_warning("as_declarative"): + + @legacy_decl.as_declarative() + class Base(object): + pass + + class Foo(Base): + __tablename__ = "foo" + id = sa.Column(sa.Integer, primary_key=True) + + assert inspect(Foo).mapper + + def test_has_inherited_table(self, registry): + @registry.mapped + class Foo(object): + __tablename__ = "foo" + id = sa.Column(sa.Integer, primary_key=True) + + @registry.mapped + class Bar(Foo): + __tablename__ = "bar" + id = sa.Column(sa.ForeignKey("foo.id"), primary_key=True) + + with self._expect_warning("has_inherited_table"): + is_true(legacy_decl.has_inherited_table(Bar)) + + with self._expect_warning("has_inherited_table"): + is_false(legacy_decl.has_inherited_table(Foo)) + + def test_synonym_for(self, registry): + with self._expect_warning("synonym_for"): + + @registry.mapped + class Foo(object): + __tablename__ = "foo" + id = sa.Column(sa.Integer, primary_key=True) + + @legacy_decl.synonym_for("id") + @property + def id_prop(self): + return self.id + + f1 = Foo(id=5) + eq_(f1.id_prop, 5) diff --git a/test/ext/declarative/test_inheritance.py b/test/ext/declarative/test_inheritance.py index a8292752ae..34bee1d142 100644 --- a/test/ext/declarative/test_inheritance.py +++ b/test/ext/declarative/test_inheritance.py @@ -4,15 +4,15 @@ from sqlalchemy import Integer from sqlalchemy import select from sqlalchemy import String from sqlalchemy import testing -from sqlalchemy.ext import declarative as decl from sqlalchemy.ext.declarative import AbstractConcreteBase from sqlalchemy.ext.declarative import ConcreteBase -from sqlalchemy.ext.declarative import declared_attr -from sqlalchemy.ext.declarative import has_inherited_table from sqlalchemy.orm import clear_mappers from sqlalchemy.orm import close_all_sessions from sqlalchemy.orm import configure_mappers +from sqlalchemy.orm import declarative_base +from sqlalchemy.orm import declared_attr from sqlalchemy.orm import exc as orm_exc +from sqlalchemy.orm import has_inherited_table from sqlalchemy.orm import polymorphic_union from sqlalchemy.orm import relationship from sqlalchemy.orm import Session @@ -34,7 +34,7 @@ class DeclarativeTestBase(fixtures.TestBase, testing.AssertsExecutionResults): def setup_test(self): global Base - Base = decl.declarative_base(testing.db) + Base = declarative_base() def teardown_test(self): close_all_sessions() @@ -348,7 +348,7 @@ class ConcreteInhTest( } Base.metadata.create_all(testing.db) - sess = Session() + sess = fixture_session() sess.add(Engineer(name="d")) sess.commit() @@ -691,52 +691,52 @@ class ConcreteExtensionConfigTest( __mapper_args__ = {"polymorphic_identity": "c", "concrete": True} Base.metadata.create_all(testing.db) - sess = Session() - sess.add_all( - [ - A( - data="a1", - collection=set( - [ - B(data="a1b1", b_data="a1b1"), - C(data="a1b2", c_data="a1c1"), - B(data="a1b2", b_data="a1b2"), - C(data="a1c2", c_data="a1c2"), - ] + with Session(testing.db) as sess: + sess.add_all( + [ + A( + data="a1", + collection=set( + [ + B(data="a1b1", b_data="a1b1"), + C(data="a1b2", c_data="a1c1"), + B(data="a1b2", b_data="a1b2"), + C(data="a1c2", c_data="a1c2"), + ] + ), ), - ), - A( - data="a2", - collection=set( - [ - B(data="a2b1", b_data="a2b1"), - C(data="a2c1", c_data="a2c1"), - B(data="a2b2", b_data="a2b2"), - C(data="a2c2", c_data="a2c2"), - ] + A( + data="a2", + collection=set( + [ + B(data="a2b1", b_data="a2b1"), + C(data="a2c1", c_data="a2c1"), + B(data="a2b2", b_data="a2b2"), + C(data="a2c2", c_data="a2c2"), + ] + ), ), - ), - ] - ) - sess.commit() - sess.expunge_all() + ] + ) + sess.commit() - eq_( - sess.query(A).filter_by(data="a2").all(), - [ - A( - data="a2", - collection=set( - [ - B(data="a2b1", b_data="a2b1"), - B(data="a2b2", b_data="a2b2"), - C(data="a2c1", c_data="a2c1"), - C(data="a2c2", c_data="a2c2"), - ] - ), - ) - ], - ) + with Session(testing.db) as sess: + eq_( + sess.query(A).filter_by(data="a2").all(), + [ + A( + data="a2", + collection=set( + [ + B(data="a2b1", b_data="a2b1"), + B(data="a2b2", b_data="a2b2"), + C(data="a2c1", c_data="a2c1"), + C(data="a2c2", c_data="a2c2"), + ] + ), + ) + ], + ) self.assert_compile( sess.query(A).join(A.collection), diff --git a/test/ext/test_associationproxy.py b/test/ext/test_associationproxy.py index db837e6b66..56797104c6 100644 --- a/test/ext/test_associationproxy.py +++ b/test/ext/test_associationproxy.py @@ -14,13 +14,13 @@ from sqlalchemy import testing from sqlalchemy.engine import default from sqlalchemy.ext.associationproxy import _AssociationList from sqlalchemy.ext.associationproxy import association_proxy -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.orm import aliased from sqlalchemy.orm import clear_mappers from sqlalchemy.orm import collections from sqlalchemy.orm import composite from sqlalchemy.orm import configure_mappers +from sqlalchemy.orm import declarative_base +from sqlalchemy.orm import declared_attr from sqlalchemy.orm import mapper from sqlalchemy.orm import relationship from sqlalchemy.orm import Session diff --git a/test/ext/test_hybrid.py b/test/ext/test_hybrid.py index dcaee0823c..f0bb87055a 100644 --- a/test/ext/test_hybrid.py +++ b/test/ext/test_hybrid.py @@ -12,8 +12,8 @@ from sqlalchemy import select from sqlalchemy import String from sqlalchemy import testing from sqlalchemy.ext import hybrid -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import aliased +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.orm import Session from sqlalchemy.orm import synonym diff --git a/test/ext/test_indexable.py b/test/ext/test_indexable.py index 295325b7b5..7a9765efb3 100644 --- a/test/ext/test_indexable.py +++ b/test/ext/test_indexable.py @@ -3,8 +3,8 @@ from sqlalchemy import inspect from sqlalchemy import Integer from sqlalchemy import testing from sqlalchemy import Text -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.indexable import index_property +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import Session from sqlalchemy.sql.sqltypes import ARRAY from sqlalchemy.sql.sqltypes import JSON diff --git a/test/ext/test_mutable.py b/test/ext/test_mutable.py index 49d3b9d90a..676d7d8b78 100644 --- a/test/ext/test_mutable.py +++ b/test/ext/test_mutable.py @@ -15,6 +15,7 @@ from sqlalchemy.ext.mutable import MutableSet from sqlalchemy.orm import attributes from sqlalchemy.orm import column_property from sqlalchemy.orm import composite +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import mapper from sqlalchemy.orm.instrumentation import ClassManager from sqlalchemy.orm.mapper import Mapper @@ -1004,7 +1005,6 @@ class MutableColumnCopyJSONTest(_MutableDictTestBase, fixtures.MappedTest): @classmethod def define_tables(cls, metadata): import json - from sqlalchemy.ext.declarative import declarative_base class JSONEncodedDict(TypeDecorator): impl = VARCHAR(50) @@ -1052,7 +1052,6 @@ class MutableColumnCopyArrayTest(_MutableListTestBase, fixtures.MappedTest): @classmethod def define_tables(cls, metadata): - from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.sql.sqltypes import ARRAY MutableList = cls._type_fixture() diff --git a/test/orm/declarative/test_basic.py b/test/orm/declarative/test_basic.py index 4e2c465d84..14f25c4793 100644 --- a/test/orm/declarative/test_basic.py +++ b/test/orm/declarative/test_basic.py @@ -67,9 +67,9 @@ class DeclarativeTestBase( global Base if self.base_style == "dynamic": - Base = declarative_base(testing.db) + Base = declarative_base() elif self.base_style == "explicit": - mapper_registry = registry(_bind=testing.db) + mapper_registry = registry() class Base(with_metaclass(DeclarativeMeta)): __abstract__ = True @@ -86,6 +86,32 @@ class DeclarativeTestBase( ("dynamic",), ("explicit",), argnames="base_style", id_="s" ) class DeclarativeTest(DeclarativeTestBase): + def test_unbound_declarative_base(self): + Base = declarative_base() + + class User(Base): + __tablename__ = "user" + id = Column(Integer, primary_key=True) + + s = Session() + + with testing.expect_raises(exc.UnboundExecutionError): + s.get_bind(User) + + def test_unbound_cls_registry(self): + reg = registry() + + Base = reg.generate_base() + + class User(Base): + __tablename__ = "user" + id = Column(Integer, primary_key=True) + + s = Session() + + with testing.expect_raises(exc.UnboundExecutionError): + s.get_bind(User) + def test_basic(self): class User(Base, fixtures.ComparableEntity): __tablename__ = "users" @@ -1056,8 +1082,8 @@ class DeclarativeTest(DeclarativeTestBase): def test_shared_class_registry(self): reg = {} - Base1 = declarative_base(testing.db, class_registry=reg) - Base2 = declarative_base(testing.db, class_registry=reg) + Base1 = declarative_base(class_registry=reg) + Base2 = declarative_base(class_registry=reg) class A(Base1): __tablename__ = "a" diff --git a/test/orm/declarative/test_deprecations.py b/test/orm/declarative/test_deprecations.py new file mode 100644 index 0000000000..e3015f6435 --- /dev/null +++ b/test/orm/declarative/test_deprecations.py @@ -0,0 +1,49 @@ +from sqlalchemy import Integer +from sqlalchemy import testing +from sqlalchemy.orm import declarative_base +from sqlalchemy.orm import registry +from sqlalchemy.orm import Session +from sqlalchemy.testing import fixtures +from sqlalchemy.testing import is_ +from sqlalchemy.testing.schema import Column + + +class BoundMetadataDeclarativeTest(fixtures.MappedTest): + def test_bound_declarative_base(self): + with testing.expect_deprecated( + "The ``bind`` argument to declarative_base" + ): + Base = declarative_base(testing.db) + + class User(Base): + __tablename__ = "user" + id = Column(Integer, primary_key=True) + + s = Session() + + is_(s.get_bind(User), testing.db) + + def test_bound_cls_registry_base(self): + reg = registry(_bind=testing.db) + + Base = reg.generate_base() + + class User(Base): + __tablename__ = "user" + id = Column(Integer, primary_key=True) + + s = Session() + + is_(s.get_bind(User), testing.db) + + def test_bound_cls_registry_decorated(self): + reg = registry(_bind=testing.db) + + @reg.mapped + class User(object): + __tablename__ = "user" + id = Column(Integer, primary_key=True) + + s = Session() + + is_(s.get_bind(User), testing.db) diff --git a/test/orm/declarative/test_inheritance.py b/test/orm/declarative/test_inheritance.py index a1e5c605bb..e5da21447a 100644 --- a/test/orm/declarative/test_inheritance.py +++ b/test/orm/declarative/test_inheritance.py @@ -3,12 +3,12 @@ from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy import testing -from sqlalchemy.ext import declarative as decl -from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.orm import class_mapper from sqlalchemy.orm import clear_mappers from sqlalchemy.orm import close_all_sessions from sqlalchemy.orm import configure_mappers +from sqlalchemy.orm import declarative_base +from sqlalchemy.orm import declared_attr from sqlalchemy.orm import deferred from sqlalchemy.orm import mapper from sqlalchemy.orm import relationship @@ -29,7 +29,7 @@ Base = None class DeclarativeTestBase(fixtures.TestBase, testing.AssertsExecutionResults): def setup_test(self): global Base - Base = decl.declarative_base(testing.db) + Base = declarative_base() def teardown_test(self): close_all_sessions() diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py index 1ca005bd09..a905d8aff2 100644 --- a/test/orm/inheritance/test_basic.py +++ b/test/orm/inheritance/test_basic.py @@ -13,12 +13,12 @@ from sqlalchemy import String from sqlalchemy import table from sqlalchemy import testing from sqlalchemy import util -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import attributes from sqlalchemy.orm import class_mapper from sqlalchemy.orm import clear_mappers from sqlalchemy.orm import column_property from sqlalchemy.orm import composite +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import deferred from sqlalchemy.orm import exc as orm_exc from sqlalchemy.orm import joinedload diff --git a/test/orm/test_collection.py b/test/orm/test_collection.py index 6188af7690..4ca2f999c3 100644 --- a/test/orm/test_collection.py +++ b/test/orm/test_collection.py @@ -10,6 +10,7 @@ from sqlalchemy import testing from sqlalchemy import text from sqlalchemy import util from sqlalchemy.orm import attributes +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import instrumentation from sqlalchemy.orm import mapper from sqlalchemy.orm import relationship @@ -2001,8 +2002,6 @@ class DictHelpersTest(OrderedDictFixture, fixtures.MappedTest): """test that uncompiled attribute usage works with column_mapped_collection""" - from sqlalchemy.ext.declarative import declarative_base - BaseObject = declarative_base() class Foo(BaseObject): diff --git a/test/orm/test_descriptor.py b/test/orm/test_descriptor.py index 7b530b9281..cea518e7c6 100644 --- a/test/orm/test_descriptor.py +++ b/test/orm/test_descriptor.py @@ -2,8 +2,8 @@ from sqlalchemy import Column from sqlalchemy import func from sqlalchemy import Integer from sqlalchemy import String -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import aliased +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import descriptor_props from sqlalchemy.orm.interfaces import PropComparator from sqlalchemy.orm.properties import ColumnProperty diff --git a/test/orm/test_events.py b/test/orm/test_events.py index 6831c8b108..8062ca7b66 100644 --- a/test/orm/test_events.py +++ b/test/orm/test_events.py @@ -9,10 +9,10 @@ from sqlalchemy import select from sqlalchemy import String from sqlalchemy import testing from sqlalchemy import update -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import attributes from sqlalchemy.orm import class_mapper from sqlalchemy.orm import configure_mappers +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import deferred from sqlalchemy.orm import events from sqlalchemy.orm import EXT_SKIP diff --git a/test/orm/test_froms.py b/test/orm/test_froms.py index 8ddb9ee4c0..863690ffb5 100644 --- a/test/orm/test_froms.py +++ b/test/orm/test_froms.py @@ -18,13 +18,13 @@ from sqlalchemy import true from sqlalchemy import union from sqlalchemy import util from sqlalchemy.engine import default -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import aliased from sqlalchemy.orm import backref from sqlalchemy.orm import clear_mappers from sqlalchemy.orm import column_property from sqlalchemy.orm import configure_mappers from sqlalchemy.orm import contains_eager +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import joinedload from sqlalchemy.orm import mapper from sqlalchemy.orm import relationship diff --git a/test/orm/test_inspect.py b/test/orm/test_inspect.py index d19d65e22a..72ab37c701 100644 --- a/test/orm/test_inspect.py +++ b/test/orm/test_inspect.py @@ -516,7 +516,7 @@ class %s(SuperCls): @testing.requires.pep520 def test_all_orm_descriptors_pep520_noinh(self): - from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import declarative_base Base = declarative_base() @@ -529,7 +529,7 @@ class %s(SuperCls): @testing.requires.pep520 def test_all_orm_descriptors_pep520_onelevel_inh(self): - from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import declarative_base Base = declarative_base() diff --git a/test/orm/test_load_on_fks.py b/test/orm/test_load_on_fks.py index 42b5b3e459..02de9b2bb4 100644 --- a/test/orm/test_load_on_fks.py +++ b/test/orm/test_load_on_fks.py @@ -2,8 +2,8 @@ from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy import testing -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import backref +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.orm import Session from sqlalchemy.orm.attributes import instance_state diff --git a/test/orm/test_rel_fn.py b/test/orm/test_rel_fn.py index ef1bf2e603..6f6b0d56df 100644 --- a/test/orm/test_rel_fn.py +++ b/test/orm/test_rel_fn.py @@ -1239,7 +1239,7 @@ class LazyClauseTest(_JoinFixtures, fixtures.TestBase, AssertsCompiledSQL): class DeannotateCorrectlyTest(fixtures.TestBase): def test_pj_deannotates(self): - from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import declarative_base Base = declarative_base() diff --git a/test/orm/test_relationships.py b/test/orm/test_relationships.py index 95c5a196ff..f9c8bae7aa 100644 --- a/test/orm/test_relationships.py +++ b/test/orm/test_relationships.py @@ -2464,7 +2464,7 @@ class NoLoadBackPopulates(_fixtures.FixtureTest): class JoinConditionErrorTest(fixtures.TestBase): def test_clauseelement_pj(self): - from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import declarative_base Base = declarative_base() @@ -2481,7 +2481,7 @@ class JoinConditionErrorTest(fixtures.TestBase): assert_raises(sa.exc.ArgumentError, configure_mappers) def test_clauseelement_pj_false(self): - from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import declarative_base Base = declarative_base() @@ -2522,7 +2522,7 @@ class JoinConditionErrorTest(fixtures.TestBase): assert_raises(sa.exc.ArgumentError, configure_mappers) def test_invalid_string_args(self): - from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import declarative_base for argname, arg in [ ("remote_side", ["c1.id"]), diff --git a/test/orm/test_unitofworkv2.py b/test/orm/test_unitofworkv2.py index 365a9b7601..b468fa72e7 100644 --- a/test/orm/test_unitofworkv2.py +++ b/test/orm/test_unitofworkv2.py @@ -16,10 +16,10 @@ from sqlalchemy import String from sqlalchemy import testing from sqlalchemy import text from sqlalchemy import util -from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import attributes from sqlalchemy.orm import backref from sqlalchemy.orm import clear_mappers +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import exc as orm_exc from sqlalchemy.orm import mapper from sqlalchemy.orm import relationship