Фильтрация по ложному значению столбца возвращает значение True

#python #python-3.x #sqlalchemy #mariadb

#python #python-3.x #sqlalchemy #mariadb

Вопрос:

У меня есть две таблицы, для которых я выполняю левое объединение, где во второй таблице есть столбец bit. Фильтр возвращает столбцы, в которых этот бит равен False. Однако, когда я проверяю это значение позже внутри цикла, оно отображается как true.

 from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, or_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm.exc import NoResultFound
# from sqlalchemy.exc import DataError
Base = declarative_base()

class BoardGame(Base):
    __tablename__ = 'game_detail'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    description = Column(String)
    process = relationship('Process', uselist=False, back_populates='game_detail')

    def __repr__(self):
        return "<BoardGame(id='{}', name='{}', description='{}'".format(
            self.id, self.name, self.description
        )

class Process(Base):
    __tablename__ = 'process'
    game_id = Column(Integer, ForeignKey('game_detail.id'), primary_key=True)
    description_bigram = Column(Boolean)
    game_detail = relationship('BoardGame', back_populates='process')

sa_engine = create_engine('mysql pymysql://bgg:blahblahblah@localhost:49000/boardgamegeek?charset=utf8mb4', pool_recycle=3600)
session = Session(bind=sa_engine)

# Set the scripts execution range of data
maximum_games_to_process = 1

for game in session.query(BoardGame.id, Process.description_bigram).join(Process, isouter=True).filter(Process.description_bigram.is_(False)).limit(maximum_games_to_process):
    print('description_bigram', type(game.description_bigram), game.description_bigram)
    print(game)
  

Выполнение вышесказанного приводит меня

 description_bigram <class 'bool'> True
(1, True)
  

Но просмотр данных в HeidiSQL показывает мне обратное.

 game_id;description_bigram
1;0
2;1
3;0
4;0
5;1
  

Вот код создания для таблицы процессов, как показано в HeidiSQL

 CREATE TABLE `process` (
    `game_id` INT(11) NOT NULL,
    `description_bigram` BIT(1) NOT NULL,
    PRIMARY KEY (`game_id`),
    CONSTRAINT `FK__GAME_ID_DESCRIPTION` FOREIGN KEY (`game_id`) REFERENCES `game_detail` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
  

Я видел, что в некоторых сообщениях упоминаются проблемы SQLAlchemy с логическими столбцами, и людям приходится менять свои таблицы и код для работы с целыми числами вместо этого (Ссылка похожа только на мою ситуацию). Я уверен, что это сработало бы, но у меня есть другие программы, которые отлично работают с битовыми столбцами и логическими определениями таблиц, поэтому я не уверен, почему эта не работает. Есть ли что-то под капотом, на что я могу посмотреть?

Это запрос, созданный SQLAlchemy

 SELECT game_detail.id AS game_detail_id, process.description_bigram AS process_description_bigram
FROM game_detail LEFT OUTER JOIN process ON game_detail.id = process.game_id
WHERE process.description_bigram IS false
  

Я попробовал несколько способов, чтобы попытаться заставить столбец зарегистрировать его правильное значение, и я просто продолжаю заканчивать тем, что это true.

Python — версия 3.6.5; SQLAlchemy — 1.2.7; 10.3.13-MariaDB

Комментарии:

1. Покажите нам SQL-запрос, сгенерированный SQLAlchemy.

2. @RickJames Я обновил вопрос с помощью SQLAlchemyQuery

3. Либо измените FALSE на NULL , либо избавьтесь от LEFT .