Convert an SFrame to a single table in a SQL database.

        This function does not attempt to create the table or check if a table
        named `table_name` exists in the database. It simply assumes that
        `table_name` exists in the database and appends to it.

        `to_sql` can be thought of as a convenience wrapper around
        parameterized SQL insert statements.

        Parameters
        ----------
        conn : dbapi2.Connection
          A DBAPI2 connection object. Any connection object originating from
          the 'connect' method of a DBAPI2-compliant package can be used.

        table_name : str
          The name of the table to append the data in this SFrame.

        dbapi_module : module | package, optional
          The top-level DBAPI2 module/package that constructed the given
          connection object. By default, a best guess of which module the
          connection came from is made. In the event that this guess is wrong,
          this will need to be specified.

        use_python_type_specifiers : bool, optional
          If the DBAPI2 module's parameter marker style is 'format' or
          'pyformat', attempt to use accurate type specifiers for each value
          ('s' for string, 'd' for integer, etc.). Many DBAPI2 modules simply
          use 's' for all types if they use these parameter markers, so this is
          False by default.

        use_exact_column_names : bool, optional
          Specify the column names of the SFrame when inserting its contents
          into the DB. If the specified table does not have the exact same
          column names as the SFrame, inserting the data will fail. If False,
          the columns in the SFrame are inserted in order without care of the
          schema of the DB table. True by default.

def to_sql(self, conn, table_name, dbapi_module=None,
            use_python_type_specifiers=False, use_exact_column_names=True):
        """
        Convert an SFrame to a single table in a SQL database.

        This function does not attempt to create the table or check if a table
        named `table_name` exists in the database. It simply assumes that
        `table_name` exists in the database and appends to it.

        `to_sql` can be thought of as a convenience wrapper around
        parameterized SQL insert statements.

        Parameters
        ----------
        conn : dbapi2.Connection
          A DBAPI2 connection object. Any connection object originating from
          the 'connect' method of a DBAPI2-compliant package can be used.

        table_name : str
          The name of the table to append the data in this SFrame.

        dbapi_module : module | package, optional
          The top-level DBAPI2 module/package that constructed the given
          connection object. By default, a best guess of which module the
          connection came from is made. In the event that this guess is wrong,
          this will need to be specified.

        use_python_type_specifiers : bool, optional
          If the DBAPI2 module's parameter marker style is 'format' or
          'pyformat', attempt to use accurate type specifiers for each value
          ('s' for string, 'd' for integer, etc.). Many DBAPI2 modules simply
          use 's' for all types if they use these parameter markers, so this is
          False by default.

        use_exact_column_names : bool, optional
          Specify the column names of the SFrame when inserting its contents
          into the DB. If the specified table does not have the exact same
          column names as the SFrame, inserting the data will fail. If False,
          the columns in the SFrame are inserted in order without care of the
          schema of the DB table. True by default.
        """
        mod_info = _get_global_dbapi_info(dbapi_module, conn)
        c = conn.cursor()

        col_info = list(zip(self.column_names(), self.column_types()))

        if not use_python_type_specifiers:
            _pytype_to_printf = lambda x: 's'

        # DBAPI2 standard allows for five different ways to specify parameters
        sql_param = {
            'qmark'   : lambda name,col_num,col_type: '?',
            'numeric' : lambda name,col_num,col_type:':'+str(col_num+1),
            'named'   : lambda name,col_num,col_type:':'+str(name),
            'format'  : lambda name,col_num,col_type:'%'+_pytype_to_printf(col_type),
            'pyformat': lambda name,col_num,col_type:'%('+str(name)+')'+_pytype_to_printf(col_type),
            }

        get_sql_param = sql_param[mod_info['paramstyle']]

        # form insert string
        ins_str = "INSERT INTO " + str(table_name)
        value_str = " VALUES ("
        col_str = " ("
        count = 0
        for i in col_info:
            col_str += i[0]
            value_str += get_sql_param(i[0],count,i[1])
            if count < len(col_info)-1:
                col_str += ","
                value_str += ","
            count += 1
        col_str += ")"
        value_str += ")"

        if use_exact_column_names:
            ins_str += col_str

        ins_str += value_str

        # Some formats require values in an iterable, some a dictionary
        if (mod_info['paramstyle'] == 'named' or\
            mod_info['paramstyle'] == 'pyformat'):
          prepare_sf_row = lambda x:x
        else:
          col_names = self.column_names()
          prepare_sf_row = lambda x: [x[i] for i in col_names]

        for i in self:
            try:
                c.execute(ins_str, prepare_sf_row(i))
            except mod_info['Error'] as e:
                if hasattr(conn, 'rollback'):
                    conn.rollback()
                raise e

        conn.commit()
        c.close()