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)
--- /dev/null
+.. 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.
)
)
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:
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):
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