在Rails中比较SQLite与MySQL查询结果时的不同类型的数据

时间:2011-03-01 04:36:30

标签: mysql ruby-on-rails sqlite activerecord

我正在寻找使用Active Record查询以下查询结果的说明:

date_range = (Date.today - 7)..(Time.now.to_datetime)
r = Report.find(:all, :conditions => {:created_at => date_range},
                      :group => 'date(created_at)',
                      :select => 'date(created_at) as day, count(id) as counter') 

基本上我只是计算表格“报告”中的结果,但我得到了命名字段“counter”的不同类型的值,双引号字符串数组与仅数字数组。

的MySQL

如果使用MySQL,

r.map(&:counter)

返回:
=> [“3”,“3”,“5”,“4”,“4”]

SQLite的

如果使用SQLite,

r.map(&:counter)

返回:
=> [3,3,5,4,4]

MySQL返回带引号(字符串)和SQLite数字的数字是否正确? 我预计两者都会返回整数。或者我在MySQL端错过了一些配置?

修改
以防万一,这两个DB都是使用正常迁移创建的,因此所有字段都是等效类型。

2 个答案:

答案 0 :(得分:1)

这是SQLite ActiveRecord适配器中的错误。

使用“SELECT expr AS col_name”合成新列值时,col_name将转换为String而不是正确的数据类型(在本例中为int)。

请参阅相关的Rails错误标记:https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4544-rails3-activerecord-sqlite3-lost-column-type-when-using-views#ticket-4544-2

显然,SQLite无法为视图返回正确的列类型值,这是在合成这样的属性时使用的机制。

答案 1 :(得分:0)

我使用底层连接执行我的SQL语句时遇到了同样的问题。

但是,我注意到,如果在exec_sql语句中使用绑定,则数据类型会按预期返回。

E.g。

ActiveRecord::Base.connection.exec_sql("select * from users where id = 35") 

结果

  

ActiveRecord :: Result:0x7fa2c6ede200 @columns = [“id”,“name”],@ hash_rows = nil,@rows = [[“35”,“FOO”]]

然而,

ActiveRecord::Base.connection.exec_sql("select * from users where id = ?", nil, [[nil,35]]) 

结果

  

ActiveRecord ::结果:0x7fa2c6ede200 @columns = [“id”,“name”],   @ hash_rows = nil,@于= [[35,“FOO”]]

请注意,数据类型为35是整数! 希望有所帮助。