ENH: support different integer types in sql
- [x] I have checked that this issue has not already been reported.
- [x] I have confirmed this bug exists on the latest version of pandas.
- [x] (optional) I have confirmed this bug exists on the master branch of pandas.

---

#### Problem description

I ran across a situation where I needed to ensure that a PostgreSQL database table retained the same data types when being read using pd.read_sql() or pd.read_sql_table().  I found that reading a table with a column type of INTEGER (sqlalchemy.types.Integer), it was converted to dtype('int64') in pandas, which subsequently got written back to the database ( df.to_sql() ) as a BigInt (sqlalchemy.types.BigInteger).  I saw that “refining integer size” was listed as a TODO item in the code, and would be happy to provide a PR if it would be accepted.  I was able to resolve this with minor modifications to io/sql.py in _harmonize_columns() and _get_dtype():

```
    def _harmonize_columns(self, parse_dates=None):
…
                elif len(df_col) == df_col.count():
                    # No NA values, can convert ints and bools
                    if col_type is np.dtype("int64") or col_type is np.dtype("int32") or col_type is bool:
                        self.frame[col_name] = df_col.astype(col_type, copy=False)

    def _get_dtype(self, sqltype):
        from sqlalchemy.types import TIMESTAMP, Boolean, Date, DateTime, Float, Integer, BigInteger, SmallInteger
…
        elif isinstance(sqltype, BigInteger):
            return np.dtype("int64")
        elif isinstance(sqltype, Integer):
            return np.dtype("int32")
        elif isinstance(sqltype, SmallInteger):
            return np.dtype("int16")
…
````

![Changes in diff format from master branch](https://user-images.githubusercontent.com/36243295/96911603-10294e80-146f-11eb-8a19-77e15d5be257.png)
