2016-08-03 49 views
5

在Python 3中將numpy整數對象的值插入到數據庫中的正確方法是什麼?在Python 2.7 numpy的數值數據類型插入到乾淨sqlite的,但他們沒有在Python 3將numpy整數類型插入到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無縫協作的原因嗎?

+0

一個numpy的整數類型不僅是數量的字節表示(它的'.item()'值);是一個對象,幾乎與單個元素0d,數組相同。所以我不認爲你可以將它保存在數據庫中的所有榮譽之中。你可以保存它的整數值,或者相​​當於一些字節,但不能保存完整的numpy對象。 'sqlite3'中有沒有關於保存用戶定義對象實例的內容? – hpaulj

+0

總是有一些嚇人的pickle-approach(針對TEXT類型),或者像[MessagePack](http://msgpack.org/)(針對BLOB類型)的更現代和基於二進制的東西。 – sascha

+0

保存'np.int64(100)'而不是'100'有什麼好處?是否有一些有用的信息在抓取過程中無法恢復?你可以看看SQLAlchemy這樣的模塊如何處理sql對象接口。 – hpaulj

回答

4

根據sqlite3的文檔:

要使用其他Python類型的SQLite的,你必須適應他們SQLite的了sqlite3的模塊支持的類型之一:NoneType之一,整數,浮點,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