From: | Daniele Varrazzo <daniele(dot)varrazzo(at)gmail(dot)com> |
---|---|
To: | Gregory Arenius <gregory(at)arenius(dot)com> |
Cc: | "psycopg(at)postgresql(dot)org" <psycopg(at)postgresql(dot)org> |
Subject: | Re: How do I convert numpy NaN objects to SQL nulls? |
Date: | 2015-08-21 10:41:00 |
Message-ID: | CA+mi_8bNJfYZJ=5sw5PgL0s09DEVNRop1j2J8b_fFtzm-88H4g@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | psycopg |
On Thu, Aug 20, 2015 at 8:34 PM, Gregory Arenius <gregory(at)arenius(dot)com> wrote:
> So, I'm trying to make a custom adapter to convert np.NaN to SQL null but
> everything I've tried results in the same NaN strings being inserted in the
> database.
>
> The code I'm currently trying is:
>
> def adapt_nans(null):
> a = adapt(None).getquoted()
> return AsIs(a)
>
> register_adapter(np.NaN, adapt_nans)
>
> I've tried a number of variations along this theme but haven't had any luck.
register_adapter takes a type as argument. np.NaN is a value of type
float instead:
In [3]: type(np.NaN)
Out[3]: float
so you should really customize the float adapter to do what you want.
def nan_to_null(f):
if f is np.NaN:
return psycopg2.extensions.AsIs('NULL')
else:
return psycopg2.extensions.Float(f)
psycopg2.extensions.register_adapter(float, nan_to_null)
>>> print cur.mogrify("select %s, %s", [10.0, np.NaN])
select 10.0, NULL
Note: the above is for clarity. For sake of
premature-micro-optimization I would actually write the adapter as:
def nan_to_null(f,
_NULL=psycopg2.extensions.AsIs('NULL'),
_NaN=np.NaN,
_Float=psycopg2.extensions.Float):
if f is not _NaN:
return _Float(f)
return _NULL
-- Daniele
From | Date | Subject | |
---|---|---|---|
Next Message | Gregory Arenius | 2015-08-27 19:21:31 | Re: How do I convert numpy NaN objects to SQL nulls? |
Previous Message | Adrian Klaver | 2015-08-20 23:32:42 | Re: How do I convert numpy NaN objects to SQL nulls? |