def read_sql(sql, con, index_col=None, coerce_float=True, params=None,<EOL>parse_dates=None, columns=None, chunksize=None):
pandas_sql = pandasSQL_builder(con)<EOL>if isinstance(pandas_sql, SQLiteDatabase):<EOL><INDENT>return pandas_sql.read_query(<EOL>sql, index_col=index_col, params=params,<EOL>coerce_float=coerce_float, parse_dates=parse_dates,<EOL>chunksize=chunksize)<EOL><DEDENT>try:<EOL><INDENT>_is_table_name = pandas_sql.has_table(sql)<EOL><DEDENT>except Exception:<EOL><INDENT>_is_table_name = False<EOL><DEDENT>if _is_table_name:<EOL><INDENT>pandas_sql.meta.reflect(only=[sql])<EOL>return pandas_sql.read_table(<EOL>sql, index_col=index_col, coerce_float=coerce_float,<EOL>parse_dates=parse_dates, columns=columns, chunksize=chunksize)<EOL><DEDENT>else:<EOL><INDENT>return pandas_sql.read_query(<EOL>sql, index_col=index_col, params=params,<EOL>coerce_float=coerce_float, parse_dates=parse_dates,<EOL>chunksize=chunksize)<EOL><DEDENT>
Read SQL query or database table into a DataFrame.

This function is a convenience wrapper around ``read_sql_table`` and
``read_sql_query`` (for backward compatibility). It will delegate
to the specific function depending on the provided input. A SQL query
will be routed to ``read_sql_query``, while a database table name will
be routed to ``read_sql_table``. Note that the delegated function might
have more specific notes about their functionality not listed here.

Parameters
----------
sql : string or SQLAlchemy Selectable (select or text object)
    SQL query to be executed or a table name.
con : SQLAlchemy connectable (engine/connection) or database string URI
    or DBAPI2 connection (fallback mode)

    Using SQLAlchemy makes it possible to use any DB supported by that
    library. If a DBAPI2 object, only sqlite3 is supported.
index_col : string or list of strings, optional, default: None
    Column(s) to set as index(MultiIndex).
coerce_float : boolean, default True
    Attempts to convert values of non-string, non-numeric objects (like
    decimal.Decimal) to floating point, useful for SQL result sets.
params : list, tuple or dict, optional, default: None
    List of parameters to pass to execute method.  The syntax used
    to pass parameters is database driver dependent. Check your
    database driver documentation for which of the five syntax styles,
    described in PEP 249's paramstyle, is supported.
    Eg. for psycopg2, uses %(name)s so use params={'name' : 'value'}
parse_dates : list or dict, default: None
    - List of column names to parse as dates.
    - Dict of ``{column_name: format string}`` where format string is
      strftime compatible in case of parsing string times, or is one of
      (D, s, ns, ms, us) in case of parsing integer timestamps.
    - Dict of ``{column_name: arg dict}``, where the arg dict corresponds
      to the keyword arguments of :func:`pandas.to_datetime`
      Especially useful with databases without native Datetime support,
      such as SQLite.
columns : list, default: None
    List of column names to select from SQL table (only used when reading
    a table).
chunksize : int, default None
    If specified, return an iterator where `chunksize` is the
    number of rows to include in each chunk.

Returns
-------
DataFrame

See Also
--------
read_sql_table : Read SQL database table into a DataFrame.
read_sql_query : Read SQL query into a DataFrame.