【发布时间】:2019-02-09 04:05:15
【问题描述】:
我的 Ruby on Rails 系统正在从 Oracle 迁移到 Microsoft SQL Server 2012。后端数据库已经由第三方从 Oracle 转换到 Microsoft SQL Server。我无法控制架构结构。这是无法更改的。
使用 activerecord-sqlserver-adapter、tiny_tds 和 Freetds 我可以连接到新数据库。大多数数据库请求运行良好。
但是,许多表具有由 SQL Server 自动递增的 ID 主键,即 PK IDENTITY(1,1) 列。使用 Oracle 连接的相同代码在 SQL Server 下失败,并出现以下错误:
TinyTds::Error: 无法将值 NULL 插入到列“ID”中
我知道它为什么这样做,因为 ID 列确实是一个 primary_key,并且 IDENTITY(1,1) 列包含 NOT NULL 限制。那也行。
如果使用原始 SQL 执行语句,插入表工作正常,当然我从 INSERT 语句中排除 ID 列。
但是,我花了几天时间在谷歌上搜索,但我找不到告诉 Ruby on Rails 不要尝试保存 ID 列的方法。
所以我有一个类的实例,@book,它包含
Library::Book(id: integer, title: string, isbn: string ...)
当我执行@book.save 时!它会产生上面的错误。
@book = Library::Book.new( .. )
:
:
@book.save!
TinyTds::Error: 无法将值 NULL 插入到列“ID”中
而不是求助于裸机 SQL,我如何做更多的 Railsy 事情并告诉它我想保存记录但不尝试保存 ID 字段,因为它是自动递增的?如此有效地我试图保存
Library::Book(title: string, isbn: string ...) 如果一个新的插入条目 或者 Library::Book(id: integer, title: string, isbn: string ...) 如果尝试更新条目。
由于施加的限制,我正在使用: 红宝石 2.3.3p222 导轨 4.0.13 活动记录(4.0.13) activerecord-sqlserver-适配器 (4.0.4) tiny_tds (1.0.2) Freetds 1.00.27
【问题讨论】:
标签: ruby-on-rails ruby activerecord sql-server-2012 tiny-tds