adapting pandas data type using psycopg2

As a data scientist you may probably use Pandas a lot to play with your data.

While it’s quite easy to read data from PostgreSQL combined with Psycopg2:

1
2
3
4
5
import psycopg2
import pandas as pd
with psycopg2.connect('some dsn') as conn:
data = pd.read_sql_query('your sql', conn)

but writing the data back to PostgreSQL we need to create some adapters. As the Pandas API doc(scroll down to bottom) shows, you may do:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import psycopg2
from psycopg2 import extensions
import numpy as np
def (x):
"""psycopg2 interpolation to float"""
return extensions.AsIs('%f' % float(x))
def to_int(x):
"""psycopg2 interpolation to int"""
return extensions.AsIs('%d' % int(x))
extensions.register_adapter(np.floating, to_float)
extensions.register_adapter(np.integer, to_int)

Notice we adapt the base type as Pandas internal storing of float/int may be a little different from what you see in ‘dtype’