Sql server RubyonRails和MSSQL服务器:尝试插入具有newid()默认值的行
(这个问题最初是几个月前在另一个论坛上发布的,没有得到任何答案……现在没有答案!) 我在RoR的第一步。我买了一本关于Ruby和RubyonRails的书。示例在MySQL上正确运行,因此我决定将其重写为MS-SQL,作为一个好的练习(并且MS-SQL是我们的标准数据库)。。这变成了一个噩梦: 我有一张有两个字段的表Sql server RubyonRails和MSSQL服务器:尝试插入具有newid()默认值的行,sql-server,ruby-on-rails,uniqueidentifier,Sql Server,Ruby On Rails,Uniqueidentifier,(这个问题最初是几个月前在另一个论坛上发布的,没有得到任何答案……现在没有答案!) 我在RoR的第一步。我买了一本关于Ruby和RubyonRails的书。示例在MySQL上正确运行,因此我决定将其重写为MS-SQL,作为一个好的练习(并且MS-SQL是我们的标准数据库)。。这变成了一个噩梦: 我有一张有两个字段的表 Tbl_People ---------- id_People primary key, newid() default value, namePeople
Tbl_People
----------
id_People primary key, newid() default value,
namePeople string
我有一个到数据库的ODBC连接。我可以列出记录,但是。。。我无法在表格中插入任何内容。Ruby生成的插入字符串如下所示:
INSERT INTO Tbl_People (id_People, namePeople) VALUES('newid','GRONDIER, Philippe')
将被拒绝,因为字符串“newid”无法插入唯一标识符/主键字段id\u People
。从逻辑上讲,返回的错误是:
DBI::DatabaseError: 37000 (8169) [Microsoft] [ODBC SQL Server Driver][SQL Server]Conversion failed when converting from a character string to uniqueidentifier
这似乎是一个非常明显的大问题和基本问题,以至于我觉得我错过了每个RoR培训文档上通常用粗体书写的内容,例如“不要尝试通过RoR插入”、“uniqueIdentifier是RoR的中文”或“RoR不适用于MS SQL Server”
有什么想法吗?我不是一个喜欢红宝石的人,所以请记住这一点。其中大部分内容在MySQL->MSSQL翻译IMO中丢失 因此,您的id是“uniqueidentifier”类型。应该发生以下两件事之一: a) 您应该传入NEWID()作为第一个参数。不是字符串“newid”,而是函数newid() b) 不要通过第一个参数。因为有一个默认值,所以只需插入NamePeople列
根据使用情况,在处理分布式数据时,我只会使用uniqueidentifier主键,对于大多数键引用,我会坚持使用良好的旧INT-IDENTITY列。查看这篇文章,不同的db类型,但本质上是相同的问题,如何对RoR隐藏默认字段,从而不会生成无效插入 EDIT@wayne conrad指出旧链接已经失效。我相信内容就是在这里找到的, 关键摘录如下 该页面的评论部分还引用了一个旨在解决该问题的项目 (链接现在不要让我失望!)
谢谢在这个博客中暴露的问题是完全不同的,但仍然是普遍感兴趣的。读完本文后,我可能想构建一个函数,在客户端生成uniqueId值。遗憾的是,链接现在已失效。插入字符串是由RUBY自动生成的,而不是由我生成的。RUBY生成字符串的方式显然是不正确的。
# HACK (JF) - This is too evil to even blog about
# When we use guid as a primary key we usually rename the original 'id'
# field to 'integer_id'. We need to hide this from rails so it doesn't
# mess with it. WARNING: This means once you use usesguid anywhere you can
# never access a column in any table anywhere called 'integer_id'
class ActiveRecord::Base
private
alias :original_attributes_with_quotes :attributes_with_quotes
def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true)
quoted = original_attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true)
quoted.delete('integer_id')
quoted
end
end