【问题标题】:Rails 3 - .each works, .find_each fails -> ActiveRecord::JDBCError: ERROR: operator does not exist: character varying >= integerRails 3 - .each 有效,.find_each 失败 -> ActiveRecord::JDBCError: ERROR: operator does not exist: character varying >= integer
【发布时间】:2016-04-19 20:17:06
【问题描述】:

我正在尝试通过查询处理大量 (+100,000) 条记录。

我正在使用类似的东西:

BigRecordPull.where(name: ['x','y','z']).each { |record| do_some_action record }

因为从内存管理的角度来看这并不好,我想改用 find_each 概述 here 所以现在代码如下所示:

BigRecordPull.where(name: ['x','y','z']).find_each { |record| do_some_action record }

问题是当我触发代码时,我收到以下错误:

ActiveRecord::JDBCError: 错误: 运算符不存在: 字符变化 >= 整数 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

如果我查看在日志中创建的 SQL 查询,我会得到如下信息:

SELECT  "big_record_pull".* FROM "big_record_pull" WHERE "big_record_pull"."name" IN ('x','y','z') AND ("big_record_pull"."name" >= 0) 

ActiveRecord 似乎添加了部分,'AND ("big_record_pull"."name" >= 0)' 这似乎是导致问题的原因。此示例中的名称是 varchar。额外的皱纹是我不控制我的 rails 项目插入的 postgresql db,所以我不能只是重新运行迁移来尝试解决这个问题。我希望有一些解决方法......我想避免运行原始 SQL。

额外信息 在上面的例子中,big_record_pull.name 也是一个 foreign_key

【问题讨论】:

  • name是表的主键吗?
  • name 将是另一个表的 foreign_key... 这可能看起来有点混乱。假设 big_record_pull 是一个具有 3 个属性的表,id 是主键,name 是外键(varchar),description 是 varchar(用于咯咯笑)。无论您搜索名称还是描述,sql 查询都是相似的,因为它创建了我不想要/不需要的额外 big_record_pull.name >= 0 部分
  • 很奇怪。如果主键(在 rails 模型中)设置为 name 而不是默认的 id,我只会期望/理解上述内容
  • @FrederickCheung,你是对的,在查看了我的模型之后,名称被用作这个特定表的主键的一部分,并作为另一个表的外键......你可能已经猜到我试图用一个简单的例子来制作一个更复杂的表格......抱歉造成混淆。

标签: ruby-on-rails ruby-on-rails-3 activerecord


【解决方案1】:

好的,问题与 gem 相关:composite_primary_keys-5.0.14.gem。

找到解决方案,here

参见 lib/composite_primary_keys/relation/batches.rb:28:in `find_in_batches' 将此块更改为:

  self.primary_key.each do |key|
      condition = case relation.columns_hash[key.to_s].type
        when :string
          table[key].not_eq ''
        when :integer
          table[key].gteq start
      end
      relation = relation.where(condition)
    end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2015-10-24
    • 1970-01-01
    • 2018-11-10
    • 2010-10-20
    • 2016-10-25
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多