2014-07-22 211 views
1

我正试图将我的应用程序从Postgres移到Oracle,并且在初始数据播种期间我正面临Oracle序列管理的一些意外。Ruby on Rails和Oracle序列

=>目标是在各种数据库(PostGres,Oracle,MSSQL)上运行相同的应用程序,并且此初始数据(管理员用户,参数...)应具有特定的ID,从1开始分配关于创作的顺序。当然,为了这个特定的目的,我可以对ID进行硬编码。

=>移植和播种由

rake db:migrate RAILS_ENV=ORACLE 
rake db:seed RAILS_ENV=ORACLE 

环境做什么都没有具体的,但相关的ActiveRecord适配器。 使用Oracle,种子数据ID不会像预期的那样从1开始(在Postgres或MS SQL中的行为),但它们以10000开头。

查看数据库迁移期间创建的序列,它们都以10000 LAST_NUMBER)。

它是一种Oracle方式,还是它是一种activerecord-oracle_enhanced-适配器的做事方式?

它为什么这样设置?

有没有办法从1开始编号?

感谢您的帮助,

最好的问候,

弗雷德

+0

什么是“分贝迁移期间创建序列”是什么意思?您使用什么工具/实用程序来执行此迁移?Oracle序列完全有可能从1开始(尽管我有兴趣理解你为什么在乎它是从1还是1万开始)。但是,如果您正在从一个数据库迁移到另一个数据库,通常希望序列从一个大于其所在位置的值开始,以免重新使用关键值。 –

回答

2

递增它是一个Oracle的方式附加键,或者是它是一个activerecord-oracle_enhanced-adapter 的做事方式?

这是适配器的做事方式。 Oracle将默认使用创建序列的最小值(通常为1)。

适配器,作为1.6.7版本,在oracle_enhanced_adapter.rb设置此:

self.default_sequence_start_value = 10000 

有没有开始从1开始编号的方式?

您可以覆盖此内容。将:sequence_start_value选项传递给create_table方法允许您指定自己的方法。

在迁移,这可能是这样的:

create_table :table_name, primary_key_trigger: true, sequence_start_value: 1 do |t| 
    ... 
0

的ID应该没有商业价值。我会改变你的方法,这样你就不会在意dbms使用什么。

我会考虑加入由触发手动填充和/或存储的填充场程序,起始于一个由1

+1

实际上,这不是关于ID的业务价值,而只是种植一致的层次结构... – user1185081