SQLAlchemy无法查询特定用户名数据的原因求助
字符集/排序规则不匹配
若MySQL表的用户名字段用了区分大小写的排序规则(比如utf8_bin),但SQLAlchemy连接时没指定对应字符集或排序规则,可能导致ORM的字符串匹配逻辑和原生SQL不一致。原生SQL直接遵循MySQL的排序规则匹配,而SQLAlchemy可能在Python层面做了字符串处理,或连接字符集设置导致编码后字符串不匹配。
验证:用SHOW CREATE TABLE your_table;查看表的排序规则,检查SQLAlchemy连接URL是否指定了正确charset,比如mysql+pymysql://user:pass@host/db?charset=utf8mb4,如果表用utf8_bin,可在连接参数里加collation=utf8_bin。会话缓存干扰
要是之前查过不存在的1ooh,SQLAlchemy的Session可能缓存了None结果,后续查询直接返回缓存,不会再访问数据库。
验证:查询前调用session.expire_all()清空缓存,或者用全新的会话重新查询。模型字段类型不匹配
虽然大部分用户正常,但还是要确认模型里的用户名字段类型和数据库实际字段是否一致,比如数据库是VARCHAR(255),模型里不能设成String(10)(长度不够会截断)。检查模型定义:class User(Base): __tablename__ = 'users' username = Column(String(255), nullable=False, unique=True)ORM生成SQL的隐性差异
开启SQLAlchemy的SQL日志,对比ORM生成的查询语句和你成功的原生SQL,看看有没有额外的转义、引号或函数处理:import logging logging.basicConfig() logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)比如是否ORM自动加了不必要的
LOWER()函数(如果你用了ilike但写法不对),导致匹配失败。
内容的提问来源于stack exchange,提问作者Tylerlv3

