Кажется, что функция 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