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

时间:2018-03-19 10:20:06

标签: python sqlite sqlalchemy case-sensitive case-insensitive

我正在使用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)

搜索变量是来自快速搜索栏的str,并且区分大小写(我从不在其上调用低位或高位)。

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

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

我应该为我的列选择另一种必须区分大小写的类型吗?

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

semeone是否知道为什么它对运算符区分大小写,而不是与like和contains函数有关?

祝你好运

路茜

1 个答案:

答案 0 :(得分:1)

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

我要做的就是激活case_sensitive_like pragma

我创建了一个类来激活pragma,如下所示:

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()])