2016-08-03 12 views
5

Jaki jest poprawny sposób wstawiania wartości liczby całkowitych obiektów do baz danych w pythonie 3? W Pythonie 2.7 NumPy typy danych numerycznych włóż czysto w SQLite, ale nie w Pythonie 3wstawianie liczb całkowitych typu numpy do sqlite z python3

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 

The np.float typów wydają się nadal działać dobrze zarówno w 2 i 3.

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

W pythonie 2, numpy liczb całkowitych skalarnych nie są już instancjami int, nawet konwertującymi liczb całkowitoliczbowych liczb zmiennoprzecinkowych na ints.

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

Czy to dlatego dbapi nie działa już bezproblemowo z numpy?

+0

numpy typu liczba całkowita jest nie tylko reprezentacją bajt liczby (to jest '.Item()' value); jest obiektem, prawie takim samym jak pojedynczy element, 0d, tablica. Więc nie sądzę, żebyś mógł go zapisać w całej swojej chytrej chwale w bazie danych. Można zapisać jego wartość całkowitą lub równoważnik bajtowy, ale nie pełny obiekt typu numpy. Czy jest coś w 'sqlite3' na temat zapisywania instancji obiektu zdefiniowanego przez użytkownika? – hpaulj

+0

Zawsze istnieje przerażające podejście do pikowania (kierowanie na typ TEXT) lub coś bardziej nowoczesnego i binarnego, jak [MessagePack] (http://msgpack.org/) (kierowanie na typ BLOB). – sascha

+0

Jaka jest korzyść z zapisywania 'np.int64 (100)' zamiast '100'? Czy są jakieś przydatne informacje, których nie można odzyskać podczas pobierania? Możesz przyjrzeć się, jak moduły takie jak SQLAlchemy obsługują interfejs obiektów sql. – hpaulj

Odpowiedz

4

Według Sqlite3 docs:

Aby używać innych typów Pythona z SQLite, należy dostosować je do jednego z obsługiwanych typów w module Sqlite3 za SQLite: jeden z NoneType, int, float, str, bajty.

Więc można dostosowaćnp.int64 typu. Trzeba zrobić coś takiego:

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

Powiązane problemy