2016-08-03 12 views
5

numpy整数オブジェクトの値をpython 3のデータベースに挿入する正しい方法は何ですか? python 2.7でnumpyの数値データ型は、sqliteのにきれいに挿入し、彼らは、Python 3numpyの整数型をpython3でsqliteに挿入する

import numpy as np 
import sqlite3 
conn = sqlite3.connect(":memory:") 
conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))") 
conn.execute("insert into foo values(?)", (np.int64(100),)) # <-- Fails in 3 

にnp.float種類はまだ両方の2と3

conn.execute("insert into foo values(?)", (np.float64(101),)) 

でうまく動作していないようですPython 2では、numpyのスカラー整数データ型はもはや整数のインスタンスではなく、整数値の浮動小数点数をintに変換します。

isinstance(np.int64(1), int) # <- true for 2, false for python 3 

dbapiがnumpyとシームレスに動作しないのはなぜですか? sqlite3のドキュメントによると

+0

numpyの整数型は、(それの '.item()'値)の数だけのバイト表現ではありません。 1つの要素、0d、配列とほぼ同じオブジェクトです。だから、私はあなたがデータベースに溜め込まれた栄光の中でそれを保存することはできないと思います。その整数値を保存することもできますし、完全なnumpyオブジェクトではなく、同等のバイトを保存することもできます。 'sqlite3'にユーザ定義のオブジェクトインスタンスを保存する方法はありますか? – hpaulj

+0

[MessagePack](http://msgpack.org/)(BLOBタイプをターゲットにする)のように、常に怖いピクルアプローチ(TEXTタイプをターゲットにする)、またはより近代的でバイナリベースのものがあります。 – sascha

+0

'100 'の代わりに' np.int64(100) 'を保存するとどのような利点がありますか?フェッチ中に回復できなかった有用な情報はありますか? SQLAlchemyのようなモジュールがSQLオブジェクト・インタフェースをどのように処理するかを見ることができます。 – hpaulj

答えて

4

SQLiteのと他のPythonの型を使用するには、sqlite3のモジュールのサポートSQLiteのためのタイプのいずれかにそれらを適応させる必要があります。NoneTypeの1、int型、float型、STR、バイト。

だから、np.int64タイプを適応させることができます。あなたはこのような何かをする必要があります

import numpy as np 
import sqlite3 

sqlite3.register_adapter(np.int64, lambda val: int(val)) 
conn = sqlite3.connect(":memory:") 
conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))") 
conn.execute("insert into foo values(?)", (np.int64(100),)) 

Docs