вставка целочисленных типов numpy в sqlite с помощью python3

5

Каков правильный способ вставки значений целочисленных объектов 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?

  • 0
    Целочисленный тип numpy - это не просто байтовое представление числа (это значение .item() ); является объектом, почти таким же, как отдельный элемент, 0d, массив. Поэтому я не думаю, что вы можете сохранить его во всей его красе в базе данных. Вы можете сохранить его целочисленное значение или эквивалент в несколько байтов, но не полный объект numpy. Есть ли что-то в sqlite3 о сохранении пользовательского экземпляра объекта?
  • 0
    Всегда существует пугающий подход к расслаиванию (нацеленный на тип TEXT), или что-то более современное и основанное на двоичном коде, например MessagePack (нацеленный на тип BLOB).
Показать ещё 7 комментариев
Теги:
numpy
python-3.x
python-db-api

1 ответ

5

Согласно документам 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),))

Docs

Ещё вопросы

Сообщество Overcoder
Наверх
Меню