Каков правильный способ вставки значений целочисленных объектов numpy в базы данных в python 3? В 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 и даже преобразуют целые числа с плавающей запятой в ints.
isinstance(np.int64(1), int) # <- true for 2, false for python 3
Именно поэтому dbapi больше не работает без использования numpy?
Согласно документам sqlite3:
Чтобы использовать другие типы Python с SQLite, вы должны адаптировать их к одному из поддерживаемых модулей sqlite3 для SQLite: один из 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),))
.item()
); является объектом, почти таким же, как отдельный элемент, 0d, массив. Поэтому я не думаю, что вы можете сохранить его во всей его красе в базе данных. Вы можете сохранить его целочисленное значение или эквивалент в несколько байтов, но не полный объект numpy. Есть ли что-то вsqlite3
о сохранении пользовательского экземпляра объекта?