如何强制filter()匹配sqlalchemy中的确切案例(区分大小写)?

San*_*ram 4 mysql sqlalchemy case-sensitive filter

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

session.query(User).filter(User.name == 'admin').all()
Run Code Online (Sandbox Code Playgroud)

我得到的所有结果都有usename为'Admin','admin','ADMIN'(基本上所有不区分大小写的'admin').我想知道如何强制filter()过滤完全匹配(不忽略大小写)?

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

  `name` VARCHAR(255) BINARY NULL UNIQUE,
Run Code Online (Sandbox Code Playgroud)

但我仍然想知道如何强制过滤器完全匹配结果(不忽略案例).无论如何使用一些内置(或自定义,如果可能)sqlalchemy功能?

thi*_*er3 7

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()
Run Code Online (Sandbox Code Playgroud)

  • 大!!但是......你怎么画出来的?我在SQLAlchemy网站上找不到关于"func"的内容:( (3认同)

jav*_*vex 1

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

SELECT user.* FROM user WHERE user.name = 'admin'
Run Code Online (Sandbox Code Playgroud)

当然,user.*将替换为所有列的显式枚举user

问题是,这取决于此查询返回的内容:如果不区分大小写进行比较,则 SQLAlchemy 无法做太多事情。根据我收集的信息,您可以使用 显式构造查询WHERE BINARY user.name = 'admin'。但是,我不知道 SQLAlchemy 的等效项,因此您可能会在此处构建文字字符串。

无论如何,我建议您在 SQLAlchemy 列表中询问特定的解决方案(特别是,我认为了解将其集成BINARYWHERE查询中的方法会很有趣)。