summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/build/changelog/unreleased_20/metadata_schema.rst5
-rw-r--r--lib/sqlalchemy/sql/schema.py5
-rw-r--r--test/sql/test_metadata.py13
3 files changed, 23 insertions, 0 deletions
diff --git a/doc/build/changelog/unreleased_20/metadata_schema.rst b/doc/build/changelog/unreleased_20/metadata_schema.rst
new file mode 100644
index 000000000..88664d1cb
--- /dev/null
+++ b/doc/build/changelog/unreleased_20/metadata_schema.rst
@@ -0,0 +1,5 @@
+.. change::
+ :tags: schema
+
+ Validate that when provided the :paramref:`_sql.MetaData.schema`
+ argument of :class:`_sql.MetaData` is a string.
diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py
index 20c0341ad..b4263137b 100644
--- a/lib/sqlalchemy/sql/schema.py
+++ b/lib/sqlalchemy/sql/schema.py
@@ -5227,6 +5227,11 @@ class MetaData(HasSchemaAttr):
examples.
"""
+ if schema is not None and not isinstance(schema, str):
+ raise exc.ArgumentError(
+ "expected schema argument to be a string, "
+ f"got {type(schema)}."
+ )
self.tables = util.FacadeDict()
self.schema = quoted_name.construct(schema, quote_schema)
self.naming_convention = (
diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py
index bd5920f13..8f6c81f15 100644
--- a/test/sql/test_metadata.py
+++ b/test/sql/test_metadata.py
@@ -783,6 +783,19 @@ class MetaDataTest(fixtures.TestBase, ComparesTables):
):
eq_(repr(const), exp)
+ @testing.variation("kind", ["engine", "conn", "something"])
+ def test_metadata_bind(self, connection, kind):
+ with expect_raises_message(
+ exc.ArgumentError,
+ "expected schema argument to be a string, got",
+ ):
+ if kind.engine:
+ MetaData(connection.engine)
+ elif kind.conn:
+ MetaData(connection)
+ else:
+ MetaData(42) # type: ignore
+
class ToMetaDataTest(fixtures.TestBase, AssertsCompiledSQL, ComparesTables):
@testing.requires.check_constraints