--- /dev/null
+.. change::
+ :tags: change, engine
+ :tickets: 4634
+
+ The :paramref:`_schema.MetaData.bind` argument as well as the overall
+ concept of "bound metadata" is deprecated in SQLAlchemy 1.4 and will be
+ removed in SQLAlchemy 2.0. The parameter as well as related functions now
+ emit a :class:`_exc.RemovedIn20Warning` when :ref:`deprecation_20_mode` is
+ in use.
+
+ .. seealso::
+
+ :ref:`migration_20_implicit_execution`
+
+
+
+.. change::
+ :tags: change, ext
+ :tickets: 5142
+
+ Added new parameter :paramref:`_automap.AutomapBase.prepare.autoload_with`
+ which supersedes :paramref:`_automap.AutomapBase.prepare.reflect`
+ and :paramref:`_automap.AutomapBase.prepare.engine`.
+
+
"""
@classmethod
+ @util.deprecated_params(
+ engine=(
+ "2.0",
+ "The :paramref:`_automap.AutomapBase.prepare.engine` parameter "
+ "is deprecated and will be removed in a future release. "
+ "Please use the "
+ ":paramref:`_automap.AutomapBase.prepare.autoload_with` "
+ "parameter.",
+ ),
+ reflect=(
+ "2.0",
+ "The :paramref:`_automap.AutomapBase.prepare.reflect` "
+ "parameter is deprecated and will be removed in a future "
+ "release. Reflection is enabled when "
+ ":paramref:`_automap.AutomapBase.prepare.autoload_with` "
+ "is passed.",
+ ),
+ )
def prepare(
cls,
+ autoload_with=None,
engine=None,
reflect=False,
schema=None,
- classname_for_table=classname_for_table,
- collection_class=list,
- name_for_scalar_relationship=name_for_scalar_relationship,
- name_for_collection_relationship=name_for_collection_relationship,
- generate_relationship=generate_relationship,
+ classname_for_table=None,
+ collection_class=None,
+ name_for_scalar_relationship=None,
+ name_for_collection_relationship=None,
+ generate_relationship=None,
):
"""Extract mapped classes and relationships from the
:class:`_schema.MetaData` and
.. versionadded:: 1.1
"""
+ glbls = globals()
+ if classname_for_table is None:
+ classname_for_table = glbls["classname_for_table"]
+ if name_for_scalar_relationship is None:
+ name_for_scalar_relationship = glbls[
+ "name_for_scalar_relationship"
+ ]
+ if name_for_collection_relationship is None:
+ name_for_collection_relationship = glbls[
+ "name_for_collection_relationship"
+ ]
+ if generate_relationship is None:
+ generate_relationship = glbls["generate_relationship"]
+ if collection_class is None:
+ collection_class = list
+
+ if autoload_with:
+ reflect = True
+
+ if engine:
+ autoload_with = engine
+
if reflect:
cls.metadata.reflect(
- engine,
+ autoload_with,
schema=schema,
extend_existing=True,
autoload_replace=False,
def _bind_or_error(schemaitem, msg=None):
+
+ util.warn_deprecated_20(
+ "The ``bind`` argument for schema methods that invoke SQL "
+ "against an engine or connection will be required in SQLAlchemy 2.0."
+ )
bind = schemaitem.bind
if not bind:
name = schemaitem.__class__.__name__
:class:`_schema.Table`, using the given :class:`.Connectable`
for connectivity.
+ .. note:: the "bind" argument will be required in
+ SQLAlchemy 2.0.
+
.. seealso::
:meth:`_schema.MetaData.create_all`.
:class:`_schema.Table`, using the given :class:`.Connectable`
for connectivity.
+ .. note:: the "bind" argument will be required in
+ SQLAlchemy 2.0.
+
.. seealso::
:meth:`_schema.MetaData.drop_all`.
return None
def create(self, bind=None, checkfirst=True):
- """Creates this sequence in the database."""
+ """Creates this sequence in the database.
+
+ .. note:: the "bind" argument will be required in
+ SQLAlchemy 2.0.
+
+ """
if bind is None:
bind = _bind_or_error(self)
bind._run_ddl_visitor(ddl.SchemaGenerator, self, checkfirst=checkfirst)
def drop(self, bind=None, checkfirst=True):
- """Drops this sequence from the database."""
+ """Drops this sequence from the database.
+
+ .. note:: the "bind" argument will be required in
+ SQLAlchemy 2.0.
+
+ """
if bind is None:
bind = _bind_or_error(self)
__visit_name__ = "metadata"
+ @util.deprecated_params(
+ bind=(
+ "2.0",
+ "The :paramref:`_schema.MetaData.bind` argument is deprecated and "
+ "will be removed in SQLAlchemy 2.0.",
+ ),
+ )
def __init__(
self,
bind=None,
database; if None, uses the existing bind on this ``MetaData``, if
any.
+ .. note:: the "bind" argument will be required in
+ SQLAlchemy 2.0.
+
:param tables:
Optional list of ``Table`` objects, which is a subset of the total
tables in the ``MetaData`` (others are ignored).
database; if None, uses the existing bind on this ``MetaData``, if
any.
+ .. note:: the "bind" argument will be required in
+ SQLAlchemy 2.0.
+
:param tables:
Optional list of ``Table`` objects, which is a subset of the
total tables in the ``MetaData`` (others are ignored).
r".*DefaultGenerator.execute\(\)",
r"The autoload parameter is deprecated and will be removed ",
#
+ #
+ # bound metadaa
+ #
+ r"The MetaData.bind argument is deprecated",
+ r"The ``bind`` argument for schema methods that invoke SQL ",
+ #
# result sets
#
r"The Row.keys\(\) function/method",
Base = automap_base(metadata=self.metadata)
engine_mock = Mock()
with patch.object(Base.metadata, "reflect") as reflect_mock:
- Base.prepare(engine_mock, reflect=True, schema="some_schema")
+ Base.prepare(autoload_with=engine_mock, schema="some_schema")
reflect_mock.assert_called_once_with(
engine_mock,
schema="some_schema",
Base = automap_base(metadata=self.metadata)
engine_mock = Mock()
with patch.object(Base.metadata, "reflect") as reflect_mock:
- Base.prepare(engine_mock, reflect=True)
+ Base.prepare(autoload_with=engine_mock)
reflect_mock.assert_called_once_with(
engine_mock,
schema=None,
class SubUser2(Single):
__mapper_args__ = {"polymorphic_identity": "u2"}
- Base.prepare(engine=testing.db, reflect=True)
+ Base.prepare(autoload_with=testing.db)
assert SubUser2.__mapper__.inherits is Single.__mapper__
__tablename__ = "joined_inh"
__mapper_args__ = {"polymorphic_identity": "u1"}
- Base.prepare(engine=testing.db, reflect=True)
+ Base.prepare(autoload_with=testing.db)
assert SubJoined.__mapper__.inherits is Joined.__mapper__
return None
Base.prepare(
- engine=testing.db,
- reflect=True,
+ autoload_with=testing.db,
generate_relationship=_gen_relationship,
)
def _automap(self, e):
Base = automap_base()
- Base.prepare(e, reflect=True)
+ Base.prepare(autoload_with=e)
time.sleep(0.01)
configure_mappers()
from sqlalchemy import testing
+from sqlalchemy.ext.automap import automap_base
from sqlalchemy.ext.horizontal_shard import ShardedSession
from sqlalchemy.orm import mapper
from sqlalchemy.testing import eq_
from sqlalchemy.testing import mock
from . import test_mutable
from .test_mutable import Foo
+from ..orm._fixtures import FixtureTest
+
+
+class AutomapTest(fixtures.MappedTest):
+ @classmethod
+ def define_tables(cls, metadata):
+ FixtureTest.define_tables(metadata)
+
+ def test_reflect_true(self):
+ Base = automap_base(metadata=self.metadata)
+ engine_mock = mock.Mock()
+ with mock.patch.object(Base.metadata, "reflect") as reflect_mock:
+ with testing.expect_deprecated(
+ "The AutomapBase.prepare.reflect parameter is deprecated",
+ "The AutomapBase.prepare.engine parameter is deprecated",
+ ):
+ Base.prepare(
+ engine=engine_mock, reflect=True, schema="some_schema"
+ )
+ reflect_mock.assert_called_once_with(
+ engine_mock,
+ schema="some_schema",
+ extend_existing=True,
+ autoload_replace=False,
+ )
class MutableIncludeNonPrimaryTest(test_mutable.MutableWithScalarJSONTest):
from sqlalchemy import exists
from sqlalchemy import ForeignKey
from sqlalchemy import func
+from sqlalchemy import inspect
from sqlalchemy import INT
from sqlalchemy import Integer
from sqlalchemy import join
eq_(t2.name, "t")
+class BoundMetadataTest(fixtures.TestBase):
+ def test_arg_deprecated(self):
+ with testing.expect_deprecated_20(
+ "The MetaData.bind argument is deprecated"
+ ):
+ m1 = MetaData(testing.db)
+
+ Table("t", m1, Column("q", Integer))
+
+ with testing.expect_deprecated_20(
+ "The ``bind`` argument for schema methods that invoke SQL "
+ "against an engine or connection will be required"
+ ):
+ m1.create_all()
+ try:
+ assert "t" in inspect(testing.db).get_table_names()
+ finally:
+ m1.drop_all(testing.db)
+
+ assert "t" not in inspect(testing.db).get_table_names()
+
+
class DeprecationWarningsTest(fixtures.TestBase, AssertsCompiledSQL):
__backend__ = True