如何强制filter()在sqlalchemy中匹配精确的大小写(区分大小写)?

问题描述 投票:0回答:3

我正在使用 sqlalchemy 和 mysql 数据库。当我在用户对象上使用以下查询时:

session.query(User).filter(User.name == 'admin').all()

我得到了用户名为“Admin”、“admin”、“ADMIN”的所有结果(基本上都是不区分大小写的“admin”)。我想知道如何强制 filter() 过滤精确匹配(不忽略大小写)?

更新:实际上我刚刚知道mysql不允许varchar()数据类型区分大小写的列。因此,最简单的解决方案是在 mysql 中声明时强制列区分大小写,如下所示:

  `name` VARCHAR(255) BINARY NULL UNIQUE,

但我仍然很想知道如何强制过滤器完全匹配结果(不忽略案例)。是否有使用一些内置(或自定义,如果可能的话)sqlalchemy 函数?

mysql filter sqlalchemy case-sensitive
3个回答
12
投票
select * from users where binary name = 'AdMin';
select * from users where binary name = 'admin';


from sqlalchemy import func
User.query.filter(User.name == func.binary('AdMin')).count()
User.query.filter(User.name == func.binary('admin')).count()

1
投票

一般来说,SQLAlchemy 所做的就是从表达式中构造一个 SQL 字符串查询。自由输入上面的表达式将产生如下所示的结果:

SELECT user.* FROM user WHERE user.name = 'admin'

当然,

user.*
将替换为所有
user
列的显式枚举。

问题在于,这取决于此查询返回的内容:如果不区分大小写进行比较,则 SQLAlchemy 无法做太多事情。根据我收集的信息,您可以使用

WHERE BINARY user.name = 'admin'
显式构造查询。但是,我不知道 SQLAlchemy 的等效项,因此您可能会在此处构建文字字符串。

无论如何,我建议您在 SQLAlchemy 列表中询问特定的解决方案(特别是,我认为了解一种将

BINARY
集成到
WHERE
查询中的方法会很有趣)。


0
投票

我想为 thinker3 的解决方案添加注释,但没有足够的声誉来发表评论。

所以,

func.binary
并不是随处可移植的。例如,它不适用于
sqlite3
引擎。

© www.soinside.com 2019 - 2024. All rights reserved.