10

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

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 のインスタンスではなく、整数値の浮動小数点数を int に変換することさえあります。

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

これが、dbapi が numpy とシームレスに動作しなくなった理由ですか?

4

3 に答える 3

10

sqlite3のドキュメントによると:

SQLite で他の Python 型を使用するには、SQLite 用に sqlite3 モジュールでサポートされている型の 1 つ (NoneType、int、float、str、bytes のいずれか) にそれらを適合させる必要があります。

したがって、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),))

ドキュメント

于 2016-08-23T16:21:51.827 に答える