code: def query(self, query, *args, **kwargs):
          
          if isinstance(query, six.string_types):
              query = text(query)
          _step = kwargs.pop('_step', QUERY_STEP)
          rp = self.executable.execute(query, *args, **kwargs)
          return ResultIter(rp, row_type=self.row_type, step=_step)
docs: Run a statement on the database directly.
  
          Allows for the execution of arbitrary read/write queries. A query can
          either be a plain text string, or a `SQLAlchemy expression
          <http://docs.sqlalchemy.org/en/latest/core/tutorial.html#selecting>`_.
          If a plain string is passed in, it will be converted to an expression
          automatically.
  
          Further positional and keyword arguments will be used for parameter
          binding. To include a positional argument in your query, use question
          marks in the query (i.e. ``SELECT * FROM tbl WHERE a = ?```). For
          keyword arguments, use a bind parameter (i.e. ``SELECT * FROM tbl
          WHERE a = :foo``).
          ::
  
              statement = 'SELECT user, COUNT(*) c FROM photos GROUP BY user'
              for row in db.query(statement):
                  print(row['user'], row['c'])
  
          The returned iterator will yield each result sequentially.