Create a :class:`prettytable.PrettyTable` from :class:`sqlalchemy.select`.

    :type sql: Select
    :param sql: a ``sqlalchemy.sql.selectable.Select`` object.

    :type engine: Engine
    :param engine: an ``sqlalchemy.engine.base.Engine`` object.

    :type limit: int
    :param limit: int, limit rows to return.

    :rtype: PrettyTable

    **中文文档**

    将sqlalchemy的sql expression query结果放入prettytable中.

    .. note::

        注意, from_db_cursor是从原生的数据库游标通过调用fetchall()方法来获取数据。
        而sqlalchemy返回的是ResultProxy类。所以我们需要从中获取游标
        至于为什么不能直接使用 from_db_cursor(engine.execute(sql).cursor) 的语法
        我也不知道为什么.

def from_sql(sql, engine, limit=None, **kwargs):
    """
    Create a :class:`prettytable.PrettyTable` from :class:`sqlalchemy.select`.

    :type sql: Select
    :param sql: a ``sqlalchemy.sql.selectable.Select`` object.

    :type engine: Engine
    :param engine: an ``sqlalchemy.engine.base.Engine`` object.

    :type limit: int
    :param limit: int, limit rows to return.

    :rtype: PrettyTable

    **中文文档**

    将sqlalchemy的sql expression query结果放入prettytable中.

    .. note::

        注意, from_db_cursor是从原生的数据库游标通过调用fetchall()方法来获取数据。
        而sqlalchemy返回的是ResultProxy类。所以我们需要从中获取游标
        至于为什么不能直接使用 from_db_cursor(engine.execute(sql).cursor) 的语法
        我也不知道为什么.
    """
    if limit is not None:
        sql = sql.limit(limit)
    result_proxy = engine.execute(sql)
    return from_db_cursor(result_proxy.cursor)