SqlAlchemy 喜欢不区分大小写的过滤器,但它应该区分大小写

SqlAlchemy like filter case insensitive but it should be case sensitive

我正在为数据库使用 SqlAlchemy,但在查询中使用 like 函数时遇到问题。

我的数据库是 SQLite。

我的要求是这样的:

self.session.query(Value.scan).filter(Value.current_value.like("%" + search + "%"), Value.tag == Tag.tag, Tag.visible == True).distinct().all()

列Value.current_value是一个String,可以看这里的声明:

class Value(Base):
    current_value = Column(String, nullable=False)

search 变量是来自快速搜索栏的 str,并且区分大小写(我从不调用 lower 或 upper)。

我想进行区分大小写的搜索,但结果不区分大小写。

我做了一些研究,喜欢应该区分大小写,而喜欢不区分大小写,所以我不明白为什么不区分大小写。

我是否应该为必须区分大小写的列选择其他类型?

另一个奇怪的事情是,我在同一列上使用函数包含时遇到同样的问题(不区分大小写的结果),但在使用 ==、!=、< 或 > 等运算符时却没有(区分大小写的结果) )

有人知道为什么它对运算符区分大小写,但对 like 和 contains 函数不区分大小写吗?

此致

露西

在 SQLite 中,LIKE 默认不区分大小写。

我必须做的是激活 case_sensitive_like pragma

我创建了一个 class 来激活这样的编译指示:

class ForeignKeysListener(PoolListener):
    """
    Class to activate the pragma case_sensitive_like, that makes the
    like and contains functions case sensitive
    """
    def connect(self, dbapi_con, con_record):
        db_cursor = dbapi_con.execute('pragma case_sensitive_like=ON')

创建引擎时,只需像这样添加侦听器:

engine = create_engine(
    'sqlite:///' + os.path.join(self.folder, 'database', 'mia2.db'),
    listeners=[ForeignKeysListener()])