Fixed regression where use of an arbitrary iterable with the
:func:`_sql.select` function was not working, outside of plain lists. The
forwards/backwards compatibility logic here now checks for a wider range of
incoming "iterable" types including that a ``.c`` collection from a
selectable can be passed directly. Pull request compliments of Oliver Rice.
Fixes: #5935
Closes: #5936
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5936
Pull-request-sha:
575ab3e7df30fc8da03752d102c8eeb6cb3a3e3d
Change-Id: Icd972f1078d9ea96c47a64133079f00d9b0a66f3
--- /dev/null
+.. change::
+ :tags: bug, sql
+ :tickets: 5935
+
+ Fixed regression where use of an arbitrary iterable with the
+ :func:`_sql.select` function was not working, outside of plain lists. The
+ forwards/backwards compatibility logic here now checks for a wider range of
+ incoming "iterable" types including that a ``.c`` collection from a
+ selectable can be passed directly. Pull request compliments of Oliver Rice.
constructs as given, as well as ORM-mapped classes.
"""
- if (args and isinstance(args[0], list)) or kw:
+ if (
+ args
+ and hasattr(args[0], "__iter__")
+ and not isinstance(args[0], util.string_types + (ClauseElement,))
+ ) or kw:
return cls.create_legacy_select(*args, **kw)
else:
return cls._create_future_select(*args)
stmt = select([column("q")])
self.assert_compile(stmt, "SELECT q")
+ def test_select_column_collection_argument(self):
+ t1 = table("t1", column("q"))
+
+ with testing.expect_deprecated_20(
+ r"The legacy calling style of select\(\) is deprecated "
+ "and will be removed in SQLAlchemy 2.0"
+ ):
+ stmt = select(t1.c)
+ self.assert_compile(stmt, "SELECT t1.q FROM t1")
+
def test_select_kw_argument(self):
with testing.expect_deprecated_20(