mysql - 是否可以绕过 Rails 活动记录日志中的 sql_color?
问题描述
我有一个问题,IPv6 地址的二进制表示会导致活动记录日志中的 sql_color 生成很长的错误消息。
该查询确实有效并且确实返回了预期的结果。
我认为这是因为二进制 IPv6 看起来像:
"\xFE\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f"
sql_color 方法将其解释为控制代码。
如果我设置:
Rails.applicaiton.config.colorize_logging = false
即使不再显示任何颜色,它仍然会这样做。
理想情况下,我想知道绕过 sql_color 的最佳方法。
现在我刚刚覆盖了该方法并将其放入开始/救援块中。
如何重现:
rails new binary_bug -d mysql
cd binary_bug
rails db:create
rails g model Bug name:text first_ip:binary second_ip:binary
将迁移更新为
class CreateBugs < ActiveRecord::Migration[5.2]
def change
create_table :bugs do |t|
t.text :name
t.binary :first_ip, limit: 16
t.binary :second_ip, limit: 16
t.timestamps
end
end
end
rails db:migrate
Bug.create(name: 'test1', first_ip: IPAddr.new('fe80::c').hton, second_ip: IPAddr.new('fe80::c').hton.to_s )
Bug.create(name: 'test2', first_ip: IPAddr.new('2001:db8:1234::').hton, second_ip: IPAddr.new('2001:db8:1234:ffff:ffff:ffff:ffff:ffff').hton.to_s )
# Try to search the DB.
bugs = Bug.where("first_ip > ?", IPAddr.new('2001:db8:1234::12').hton)
这将给出一个很长的错误,开头为:
无法记录“sql.active_record”事件。ArgumentError:UTF-8 中的无效字节序列
它指向的第一个文件是:
gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:71:in `sql_color'"
这是一个私有方法,如下所示:
def sql_color(sql)
case sql
when /\A\s*rollback/mi
RED
when /select .*for update/mi, /\A\s*lock/mi
WHITE
when /\A\s*select/i
BLUE
when /\A\s*insert/i
GREEN
when /\A\s*update/i
YELLOW
when /\A\s*delete/i
RED
when /transaction\s*\Z/i
CYAN
else
MAGENTA
end
end
如果我只用 MAGENTA 替换它或将其包装在开始/救援块中并重新启动 spring,它将正常工作。
解决方案
推荐阅读
- php - 定义有关 Player_HP 和 Damage 的变量
- c# - 从 DataTable 填充 DataGridViewComboBoxCell 不起作用
- python - 如何使用 pythonnet 在 python 侦听器中订阅 .NET 事件?
- mysql - 如何内连接两个其他内连接查询
- reactjs - 简单的引导按钮在 React 中不显示变体颜色
- php - 标题卡在屏幕中央
- python - 如何制作平滑的热图?
- haskell - Haskell 错误 - 由于使用“随机”而产生的不明确的类型变量“b0”
- python - matlab interp2函数用于Python上的图像插值?
- c++ - gSOAP:wsdl2h 选项 -L 变化很大