]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Table arguments name and metadata are positional only
authorFederico Caselli <cfederico87@gmail.com>
Mon, 5 Apr 2021 19:57:24 +0000 (21:57 +0200)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 6 Apr 2021 22:04:45 +0000 (18:04 -0400)
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
(cherry picked from commit 3de954bc027ebf655e7ed26c83cfb3fd4b7b5edf)

doc/build/changelog/unreleased_13/6135.rst [new file with mode: 0644]
lib/sqlalchemy/sql/schema.py
test/sql/test_metadata.py

diff --git a/doc/build/changelog/unreleased_13/6135.rst b/doc/build/changelog/unreleased_13/6135.rst
new file mode 100644 (file)
index 0000000..12fb9eb
--- /dev/null
@@ -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.
index e6ab8efb53671fe7f773930fa57c6477a9a5e6bf..41e8958cb7705438972f56f3a4e9e839e64e556e 100644 (file)
@@ -507,14 +507,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:
index 5cd97c5ef8abefe8414718a412cfc9748e0dfd68..3387a8703476819192f87fa91599d9240fbb37a3 100644 (file)
@@ -52,6 +52,7 @@ from sqlalchemy.testing import is_
 from sqlalchemy.testing import is_false
 from sqlalchemy.testing import is_true
 from sqlalchemy.testing import mock
+from sqlalchemy.testing.assertions import assert_raises_message_context_ok
 
 
 class MetaDataTest(fixtures.TestBase, ComparesTables):
@@ -1944,6 +1945,23 @@ class PKAutoIncrementTest(fixtures.TestBase):
         t3.append_constraint(pk)
         is_(pk._autoincrement_column, t3.c.a)
 
+    def test_no_kw_args(self):
+        assert_raises_message_context_ok(
+            TypeError,
+            r"Table\(\) takes at least two positional-only arguments",
+            Table,
+            name="foo",
+            metadata=MetaData(),
+        )
+
+        assert_raises_message_context_ok(
+            TypeError,
+            r"Table\(\) takes at least two positional-only arguments",
+            Table,
+            "foo",
+            metadata=MetaData(),
+        )
+
 
 class SchemaTypeTest(fixtures.TestBase):
     __backend__ = True