Добавить поддержку 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