From 3de954bc027ebf655e7ed26c83cfb3fd4b7b5edf Mon Sep 17 00:00:00 2001 From: Federico Caselli Date: Mon, 5 Apr 2021 21:57:24 +0200 Subject: [PATCH] Table arguments name and metadata are positional only The :class:`_sql.Table` object now raises an informative error message if it is instantiated without passing at least the :paramref:`_sql.Table.name` and :paramref:`_sql.Table.metadata` arguments positionally. Previously, if these were passed as keyword arguments, the object would silently fail to initialize correctly. Fixes: #6135 Change-Id: I54d0c89fd549fc504289a87ea0bb37369f982b06 --- doc/build/changelog/unreleased_13/6135.rst | 10 ++++++++++ lib/sqlalchemy/sql/schema.py | 7 +++++-- test/sql/test_metadata.py | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 doc/build/changelog/unreleased_13/6135.rst diff --git a/doc/build/changelog/unreleased_13/6135.rst b/doc/build/changelog/unreleased_13/6135.rst new file mode 100644 index 0000000000..12fb9eb239 --- /dev/null +++ b/doc/build/changelog/unreleased_13/6135.rst @@ -0,0 +1,10 @@ +.. change:: + :tags: sql, bug + :tickets: 6135 + :versions: 1.4.6 + + The :class:`_sql.Table` object now raises an informative error message if + it is instantiated without passing at least the :paramref:`_sql.Table.name` + and :paramref:`_sql.Table.metadata` arguments positionally. Previously, if + these were passed as keyword arguments, the object would silently fail to + initialize correctly. diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py index 9d76173705..f2c1c86ec8 100644 --- a/lib/sqlalchemy/sql/schema.py +++ b/lib/sqlalchemy/sql/schema.py @@ -546,14 +546,17 @@ class Table(DialectKWArgs, SchemaItem, TableClause): ), ) def __new__(cls, *args, **kw): - if not args: + if not args and not kw: # python3k pickle seems to call this return object.__new__(cls) try: name, metadata, args = args[0], args[1], args[2:] except IndexError: - raise TypeError("Table() takes at least two arguments") + raise TypeError( + "Table() takes at least two positional-only " + "arguments 'name' and 'metadata'" + ) schema = kw.get("schema", None) if schema is None: diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index e2f015b00e..25834ac766 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -47,6 +47,7 @@ from sqlalchemy.testing import AssertsCompiledSQL from sqlalchemy.testing import ComparesTables from sqlalchemy.testing import emits_warning from sqlalchemy.testing import eq_ +from sqlalchemy.testing import expect_raises_message from sqlalchemy.testing import fixtures from sqlalchemy.testing import is_ from sqlalchemy.testing import is_false @@ -2022,6 +2023,20 @@ class PKAutoIncrementTest(fixtures.TestBase): t3.append_constraint(pk) is_(pk._autoincrement_column, t3.c.a) + def test_no_kw_args(self): + with expect_raises_message( + TypeError, + r"Table\(\) takes at least two positional-only arguments", + check_context=False, + ): + Table(name="foo", metadata=MetaData()) + with expect_raises_message( + TypeError, + r"Table\(\) takes at least two positional-only arguments", + check_context=False, + ): + Table("foo", metadata=MetaData()) + class SchemaTypeTest(fixtures.TestBase): __backend__ = True -- 2.47.2