Добавить поддержку 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 для решения этой проблемы. Я попытался обновить гем, и это превратилось в ад зависимостей, и в конечном итоге выглядело так, как будто мне придется перейти на рельсы 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.

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


person user2967603    schedule 14.08.2014    source источник


Ответы (3)


Я нашел гораздо лучшее решение, чем патч для обезьян. Оказывается, ребята из 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" 
person user2967603    schedule 14.08.2014

Я сделал следующее с 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
person donvnielsen    schedule 11.02.2015
comment
@donfnielson, где был создан вышеуказанный модуль, можете ли вы указать мне путь и имя файла? - person newbie; 26.07.2019

Я также решил эту проблему с помощью установки 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. .

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

person Timothy Dooling    schedule 10.01.2019