Добавить поддержку SQL 2014 в activerecord-sqlserver-adapter

Мы использовали гем activerecord-sqlserver-adapter с sqlserver 2008, и все отлично работает. Мы только что попытались развернуть наше приложение Rails 3 на новой базе данных sqlserver 2014, и я получаю сообщение об ошибке:

Currently, only 2005, 2008, 2010, 2011, and 2012 are supported. We got back Microsoft SQL Server 2014 - 12.0.2000.8 (X64)

Беглый взгляд на github показывает, что недавно было сделано небольшое обновление для sqlserver_adapter.rd, чтобы решить эту проблему. Я попытался обновить драгоценный камень, и он превратился в адский ад зависимостей, и в итоге я выглядел так, как будто мне нужно было обновить до rails 4 (что я сейчас не особо хочу делать), чтобы получить это исправление.

Поэтому я подумал, что сделаю свою первую попытку исправления обезьяны и создал.rd в моей папке инициализаторов, которая включает изменения для добавления поддержки sqlserver 2014:

module ConnectionAdapters  

    class SqlServerAdapter < AbstractAdapter
      SUPPORTED_VERSIONS = [2005,2008,2010,2011,2012,2014]


      # === SQLServer Specific (DB Reflection) ======================== #

       def sqlserver_2014?
        @database_year == 2014
      end



    end
   end

Мое намерение состояло в том, чтобы просто переопределить несколько строк кода в sqlserver_adapter.rd с изменением исправления на github. Однако, когда я пытаюсь развернуть, я теперь получаю ошибку UnitializedConstant, ссылающуюся на AbstractAdapter.

Как заставить этот патч работать? Или это лучший способ выполнить эту задачу?

2 ответа

Решение

Я нашел намного лучшее решение, чем патч обезьяны. Оказывается, ребята из activerecord-sqlserver-adapter обновили различные выпуски, поэтому мне просто пришлось указать ветку версии 3.2 с исправлением поддержки SQLServer 2014. Следующая строка в моем файле gem решила всю проблему, и теперь мы подключаемся к SqlServer '14

gem 'activerecord-sqlserver-adapter', :git => "git://github.com/rails-sqlserver/activerecord-sqlserver-adapter.git", :branch => "3-2-stable" 

Я также решил эту проблему с установкой Ruby 1.8.6, которую я унаследовал.

Решение на самом деле не такое высокотехнологичное, как предлагается здесь.

Интерфейс адаптера находится по адресу C:\ruby\lib\ruby\gems\1.8\gems\activerecord-sqlserver-adapter-2.3.4\lib\active_record\connection_adapters и называется sqlserver_adapter.rb,

Я изменил следующий код, чтобы он выглядел так:

    class SQLServerAdapter < AbstractAdapter

  ADAPTER_NAME                = 'SQLServer'.freeze
  VERSION                     = '2.3.4'.freeze
  DATABASE_VERSION_REGEXP     = /Microsoft SQL Server\s+(\d{4})/
  SUPPORTED_VERSIONS          = [2000,2005,2008,2012,2016].freeze
  LIMITABLE_TYPES             = ['string','integer','float','char','nchar','varchar','nvarchar'].freeze
  LOST_CONNECTION_EXCEPTIONS  = {
    :odbc => ['ODBC::Error'],
    :ado  => []
  }
  LOST_CONNECTION_MESSAGES    = {
    :odbc => [/link failure/, /server failed/, /connection was already closed/, /invalid handle/i],
    :ado  => []
  }

Единственное, что я сделал, чтобы изменить код адаптера, было изменение [2000,2005,2008] в [2000,2005,2008,2012,2016],

Затем я использовал Администратор источника данных ODBC (32-разрядный), чтобы настроить использование "Собственного клиента SQL Server 11.0" для экземпляра Sql Server 2016.

Этот последний шаг является действительно важным в настройке адаптера ODBC.

Адаптер "SQL Server" может по умолчанию использовать 64-разрядное соединение, которое выдает следующую ошибку при попытке подключения к базе данных:

#<ODBC::Error: S1090 (0) [Microsoft][ODBC Driver Manager] Invalid string or buffer length>.

Я переоснащаю устаревший серверный набор 2008R2 устаревших программ Ruby, работающих на Apache, под новую установку Windows Server 2016, и не могу позволить себе отладку устаревшего кода Ruby, чтобы он работал с более новыми версиями Ruby и Ruby on Rails,

Это низкотехнологичное решение полностью отвечает нашим оперативным потребностям, бюджету и временным ограничениям.

Я сделал следующее с v 4.1.8:

module ActiveRecord
  module ConnectionAdapters
    class SQLServerAdapter < AbstractAdapter
      SUPPORTED_VERSIONS << 2014
      # === SQLServer Specific (DB Reflection) ======================== #

      def sqlserver_2014?
        @database_year = 2014
      end
    end
  end
end
Другие вопросы по тегам