# we get just "SELECT 1" without any entities.
return sql.exists(
self.enable_eagerloads(False)
- .add_columns("1")
+ .add_columns(sql.literal_column("1"))
.with_labels()
.statement.with_only_columns([1])
)
check_column = False
if isinstance(column, util.string_types):
+ util.warn_deprecated(
+ "Plain string expression passed to Query() should be "
+ "explicitly declared using literal_column(); "
+ "automatic coercion of this value will be removed in "
+ "SQLAlchemy 1.4"
+ )
column = sql.literal_column(column)
self._label_name = column.name
search_entities = False
from sqlalchemy.util.compat import pypy
from . import _fixtures
from .test_options import PathTest as OptionsPathTest
+from .test_query import QueryTest
from .test_transaction import _LocalFixture
s.is_modified(f1, passive=True)
+class DeprecationQueryTest(QueryTest, AssertsCompiledSQL):
+ __dialect__ = "default"
+
+ def test_textual_query_column(self):
+ s = Session()
+
+ with assertions.expect_deprecated(
+ r"Plain string expression passed to Query\(\) should be "
+ "explicitly "
+ ):
+ self.assert_compile(s.query("1"), "SELECT 1")
+
+ def test_as_column(self):
+ User = self.classes.User
+
+ s = Session()
+ with assertions.expect_deprecated(
+ r"Plain string expression passed to Query\(\) should be "
+ "explicitly "
+ ):
+ eq_(
+ s.query(User.id, "name").order_by(User.id).all(),
+ [(7, "jack"), (8, "ed"), (9, "fred"), (10, "chuck")],
+ )
+
+ def test_raw_columns(self):
+ addresses, users, User = (
+ self.tables.addresses,
+ self.tables.users,
+ self.classes.User,
+ )
+
+ sess = create_session()
+ (user7, user8, user9, user10) = sess.query(User).all()
+ expected = [
+ (user7, 1, "Name:jack"),
+ (user8, 3, "Name:ed"),
+ (user9, 1, "Name:fred"),
+ (user10, 0, "Name:chuck"),
+ ]
+
+ # test with a straight statement
+ s = select(
+ [
+ users,
+ func.count(addresses.c.id).label("count"),
+ ("Name:" + users.c.name).label("concat"),
+ ],
+ from_obj=[users.outerjoin(addresses)],
+ group_by=[c for c in users.c],
+ order_by=[users.c.id],
+ )
+ q = create_session().query(User)
+
+ with assertions.expect_deprecated(
+ r"Plain string expression passed to Query\(\) should be "
+ "explicitly "
+ ):
+ result = (
+ q.add_column("count")
+ .add_column("concat")
+ .from_statement(s)
+ .all()
+ )
+ assert result == expected
+
+
class DeprecatedAccountingFlagsTest(_LocalFixture):
def test_rollback_no_accounting(self):
User, users = self.classes.User, self.tables.users
.order_by(User.id)
)
q = sess.query(User)
- result = q.add_column("count").from_statement(s).all()
+ result = q.add_column(literal_column("count")).from_statement(s).all()
assert result == expected
def test_raw_columns(self):
)
q = create_session().query(User)
result = (
- q.add_column("count").add_column("concat").from_statement(s).all()
+ q.add_column(literal_column("count"))
+ .add_column(literal_column("concat"))
+ .from_statement(s)
+ .all()
)
assert result == expected
User = self.classes.User
s = create_session()
+
+ # text() will work in 1.4
assert_raises(
sa_exc.InvalidRequestError, s.query, User.id, text("users.name")
)
eq_(
- s.query(User.id, "name").order_by(User.id).all(),
+ s.query(User.id, literal_column("name")).order_by(User.id).all(),
[(7, "jack"), (8, "ed"), (9, "fred"), (10, "chuck")],
)
from sqlalchemy import ForeignKey
from sqlalchemy import inspect
from sqlalchemy import Integer
+from sqlalchemy import literal_column
from sqlalchemy import select
from sqlalchemy import String
from sqlalchemy import testing
sess = create_session()
self.assert_compile(
- sess.query(User, "1"),
+ sess.query(User, literal_column("1")),
"SELECT users.id AS users_id, users.name AS users_name, "
"1 FROM users",
)