Моя система Ruby on Rails переходит с Oracle на Microsoft SQL Server 2012. Внутренняя база данных уже на треть преобразована с Oracle на Microsoft SQL Server. Я не контролирую структуру схемы. Это не может быть изменено.
Используя activerecord-sqlserver-adapter, tiny_tds и Freetds, я могу подключиться к новой базе данных. Большинство запросов к БД работают хорошо.
Однако многие таблицы имеют первичные ключи ID, которые автоматически увеличиваются SQL Server, другими словами, столбцы PK IDENTITY(1,1). Тот же код, который работал с соединениями Oracle, не работает под SQL Server со следующей ошибкой:
TinyTds::Error: невозможно вставить значение NULL в столбец «ID»
Я знаю, почему это делается, поскольку столбец ID действительно является столбцом primary_key и IDENTITY (1,1) и включает ограничение NOT NULL. Это нормально.
Вставка в таблицу работает нормально, если используются необработанные операторы выполнения SQL, где, конечно, я исключаю столбец ID из оператора INSERT.
Однако я потратил несколько дней на гугление и не могу найти способ сказать Ruby on Rails не пытаться сохранить столбец идентификатора.
Итак, у меня есть экземпляр класса @book, который содержит
Library::Book(id: integer, title: string, isbn: string...)
Когда я делаю @book.save! он генерирует ошибку выше.
@book = Library::Book.new( .. )
:
:
@book.save!
TinyTds::Error: невозможно вставить значение NULL в столбец «ID»
Вместо того, чтобы прибегать к голому железу SQL, как мне сделать что-то более Railsy и сказать ему, что я хочу сохранить запись, но не пытаться сохранить поле идентификатора, поскольку оно автоматически увеличивается? Так эффективно я пытаюсь спасти
Library::Book(title: string, isbn: string...), если вставляется новая запись, или Library::Book(id: integer, title: string, isbn: string...), если вы пытаетесь обновить запись.
Из-за наложенных ограничений я использую: Ruby 2.3.3p222 Rails 4.0.13 activerecord (4.0.13) activerecord-sqlserver-adapter (4.0.4) tiny_tds (1.0.2) Freetds 1.00.27