Ruby on Rails where子句无法查询到正确记录的问题咨询
这种情况我之前也碰到过几次,大概率是数据迁移后的隐性不兼容问题,给你几个针对性的排查方向:
检查数据类型是否匹配
虽然你在Rails模型里定义subtype是整数类型,但迁移后数据库里的实际字段类型或存储值可能有偏差。比如原库的subtype是tinyint,新库是int,或者迁移后值被存成了字符串(比如'172'而非整数172)。
你可以在Rails控制台里直接查询原始数据库值验证:ActiveRecord::Base.connection.execute("SELECT subtype FROM pois WHERE id=33").first如果返回的是字符串,那用整数
172查询自然匹配不上,这时候要么把字段统一转为整数类型,要么查询时用字符串条件Poi.where(:subtype => '172').first。排查索引损坏问题
MySQL迁移过程中偶尔会出现索引未正确创建或损坏的情况,导致基于哈希条件的查询失效。你可以先尝试用原生SQL字符串查询:Poi.where("subtype = 172").first如果这个能查到结果,那基本可以确定是索引的问题。需要重建
subtype字段的索引:# 先移除旧索引(如果存在) remove_index :pois, :subtype # 重建索引 add_index :pois, :subtype执行完迁移后重启控制台再测试查询。
清除Rails查询缓存
刚迁移完数据时,Rails的查询缓存可能会保留旧的查询结果,导致异常。你可以先在控制台执行:Rails.cache.clear然后关闭当前控制台重新打开,再尝试查询。另外也可以用
unscoped绕过可能存在的默认scope限制:Poi.unscoped.where(:subtype => 172).first对比数据库字符集与排序规则
虽然整数类型理论上不受字符集影响,但新旧数据库的表排序规则差异偶尔也会导致比较异常。你可以在MySQL客户端分别执行SHOW CREATE TABLE pois;,对比新旧库中subtype的字段定义、表的字符集和排序规则是否一致。如果有差异,调整新库的配置后重新导入数据。验证数据库原始数据
最后直接在MySQL客户端执行原生查询:SELECT * FROM pois WHERE subtype=172;如果这条SQL能查到记录,但Rails查不到,那问题出在Rails层(比如模型定义、缓存或scope);如果MySQL里也查不到,说明迁移过程中这条记录的
subtype值未正确导入,需要检查dump文件或重新迁移该记录。
内容的提问来源于stack exchange,提问作者Nils Kuijpers

