Другой тип данных при сравнении SQLite и MySQL приводит к тому, что в Rails - PullRequest
1 голос
/ 01 марта 2011

Я ищу объяснение результата следующего запроса с 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') 

По сути, я просто подсчитываю результаты в таблице «отчеты», но я получил разные типы значений для именованного поля «счетчик», массив строк в двойных кавычках и массив только чисел.

MySQL

Если используется MySQL,

r.map(&:counter)

возвращается:
=> ["3", "3", "5", "4", "4"]

SQLite

Если используется SQLite,

r.map(&:counter)

возвращается:
=> [3, 3, 5, 4, 4]

Правильно ли, что MySQL возвращает числа с кавычками (строками) и числами SQLite? Я ожидал, что оба возвращают только целые числа. Или мне не хватает конфигурации на стороне MySQL?

Edit:
На всякий случай обе БД созданы с использованием обычных миграций, поэтому все поля имеют эквивалентные типы.

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Это ошибка в адаптере SQLite ActiveRecord.

Когда вы синтезируете новые значения столбцов, используя «SELECT expr AS col_name», имя-столбца приводится к строке вместо правильного типа данных (в данном случае 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 не может возвращать правильные значения типа столбца для представлений, что является механизмом, используемым при синтезировании таких атрибутов.

0 голосов
/ 24 апреля 2014

У меня была та же проблема с использованием базового соединения для выполнения моих операторов SQL.

Однако я заметил, что если вы используете привязки в операторе exec_sql, типы данных возвращаются, как и ожидалось,

Например

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 :: Result: 0x7fa2c6ede200 @columns = ["id", "name"], @ hash_rows = nil, @rows = [[35, "FOO"]]

Обратите внимание, что тип данных 35 является целым числом!Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...