【问题标题】:ActiveRecord::Base SQL result object types different in MySQL and PostgreSQLActiveRecord::Base SQL 结果对象类型在 MySQL 和 PostgreSQL 中不同
【发布时间】:2014-01-07 22:29:41
【问题描述】:

我错过了什么吗?相同的控制台,相同的代码库,不同的数据库连接。结果:返回不同的对象类型。如果使用 MySQL,我们得到一个数组数组,如果使用 PostgreSQL,我们得到一个哈希数组。

示例类

class User < ActiveRecord::Base
   ...
end

class Series < ActiveRecord::Base
   establish_connection postgres_database_hash
   ...
end

使用 MySQL 连接

> User.connection.execute('SELECT * from users limit 2').to_a
   (211.0ms)  SELECT * from users limit 2
 => [[1, "jmetta", "jmetta@gmail.com"], [2, "johnmetta", "jmetta+test@gmail.com"]]

使用 Postgres 连接

> Series.connection.execute('SELECT * from series limit 2').to_a
   (107.1ms)  SELECT * from series limit 2
 => [{"id"=>"29", "enr_id"=>"114118", "ent_id"=>"164",}, {"id"=>"30", "enr_id"=>"114110", "ent_id"=>"164"}]

尾声

看起来,在这个抽象级别,to_a 被要求给出结果,结果应该是相同的。

【问题讨论】:

    标签: mysql ruby-on-rails postgresql rails-activerecord


    【解决方案1】:

    您缺少的是execute 是与底层数据库驱动程序的非常低级别的连接,对于将 SQL DDL (Data Definition Language) 发送到数据库以手动更改表、添加约束和AR 不理解的索引等。如果您想将原始查询发送到数据库并返回原始结果,您应该改用更高级别的select_rows

    User.connection.select_rows('SELECT * from users limit 2').each do |row|
      # `row` is an Array of Strings here
    end
    

    select_rows 调用应该为您提供包含任何数据库的字符串数组。

    execute 将返回底层驱动程序返回的任何内容,select_rows 将返回一致的内容。

    【讨论】:

    • 我实际上从未见过 select_rows,这意味着我的代码库中有很多代码可能应该更新。这很漂亮。谢谢。
    • 遗憾的是,我们在 Ruby 中没有像 Perl 的 DBI 这样一致的低级数据库接口,ORM 在很多事情上确实不适合。
    • 同意。我用 actual DDL 命令在 SQL 中花费了很多时间,并且我正在尽我所能尽可能接近 Ruby。似乎当我这样做时,我的破坏比我想要的要多(因为我认为 ORM 是一个强大的低级层,但也因为我似乎需要更多的 RTFM)
    • 我是那些认为数据库应该管理数据的怪人之一,所以我到处都有触发器、检查约束……;我也喜欢使用“高级”SQL,如 CTE、派生表、窗口函数……所以我必须一直把 ORM 推开(然后抱怨 ORM 是多么愚蠢,甚至是我的 ORM我自己写的:)
    • 如果您对字符串中的原始 SQL 有疑问,请使用 sql_query gem。这解决了我使用高级 SQL 的许多问题。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多