As the exception message suggests, the str 'SELECT id, name FROM item LIMIT 50;' is not an executable object. To make it executable, wrap it with sqlalchemy.text.
from sqlalchemy import text
async with self.async_engine.connect() as con:
query = "SELECT id, name FROM item LIMIT 50;"
result = await con.execute(text(query))
async.connection.execute requires that its statement argument
[…] is always an object that is in both the ClauseElement and
Executable hierarchies, including:
Select
Insert, Update, Delete
TextClause and TextualSelect
DDL and objects which inherit from DDLElement
The synchronous connection.execute method permits raw strings, but this is deprecated in v1.4 and has been removed in SQLAlchemy 2.0.