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功能?
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 所做的就是从表达式构造一个 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 列表中询问特定的解决方案(特别是,我认为了解将其集成BINARY到WHERE查询中的方法会很有趣)。
| 归档时间: |
|
| 查看次数: |
2380 次 |
| 最近记录: |