SQLAlchemy и фильтрация с numpy типами данных - PullRequest
0 голосов
/ 04 февраля 2020

Кажется, что функция SQLAlchemy .filter () не может работать с типами данных numpy. Если я использую np.int32 в аргументе фильтра, желаемый результат не достигается. Вместо этого мне нужно привести свой np.int32 к int, чтобы запрос работал должным образом.

В следующем примере я запрашиваю значения из базы данных, делаю некоторый выбор с помощью numpy и снова запрашиваю с уменьшенным выбор (я знаю, что это не значимая операция, это просто для демонстрации проблемы)

import numpy as np

from sqlalchemy import Column, Integer, Float, ForeignKey
from sqlalchemy.ext.declarative import declarative_base

# ORM
Base = declarative_base()

class Example(Base):
    __tablename__ = 'Example'

    UID = Column(Integer, primary_key=True, autoincrement=True)
    Value = Column(Float)


from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///example.db', echo=False)
Session = sessionmaker(bind=engine)
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

value = [1.1, 1.2, 2.1, 2.2]

session = Session()

for vi in value:
    example = Example(Value=vi)
    session.add(example)
    session.commit()


res = session.query(Example.UID, Example.Value).all()

uids = []
vals = []
for resi in res:
    uids.append(resi[0])
    vals.append(resi[1])

uids = np.array(uids) # creates a numpy array with elements of type np.int32
vals = np.array(vals)

idxsel = vals > 2
uids_sel = uids[idxsel]

for uidi in uids_sel:
    res = session.query(Example.Value).filter(Example.UID==uidi).all() # returns empty list
    print('without cast: {}'.format(res))
    res = session.query(Example.Value).filter(Example.UID==int(uidi)).all()
    print('with cast: {}'.format(res))

В результате получается

without cast: []
with cast: [(2.1,)] 
without cast: [] 
with cast: [(2.2,)]

Я не уверен, почему numpy тип данных не работает. У меня никогда не было проблем с совместимостью с numpy. Для меня это довольно серьезный вопрос. Конечно, вы можете выполнять приведение, но, так как нет предупреждений или ошибок, это действительно может привести к серьезным проблемам (случайно пропущенное приведение), поскольку пустой список, конечно, является правильным ответом, если ваш запрос не совпадает ...

Поскольку и numpy, и sqlalchemy довольно широко распространены, было бы замечательно, если бы они были совместимы ...

Мне действительно интересно, что я нигде не нашел упоминания об этой проблеме через Google. Так что, возможно, я что-то упускаю или делаю что-то не так. Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Проблема с API sqlite3, а не с sqlalchemy. Однако с помощью sqlalchemy мы можем использовать TypeDecorators, чтобы обойти эту проблему: https://github.com/sqlalchemy/sqlalchemy/issues/3586

РЕДАКТИРОВАТЬ: И вот стекопоток о том, как бороться с ним без использования sqlalchemy вставка numpy целочисленных типов в sqlite с python3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...