gpt4 book ai didi

ruby-on-rails - postgresql nextval 生成现有值

转载 作者:行者123 更新时间:2023-11-29 11:22:54 25 4
gpt4 key购买 nike

我不得不从基于 mySql 的 ruby​​ on rails 应用程序迁移到使用 postgresql。到目前为止没有问题,但我不知道如何解决。

数据的迁移带来了 id,而 postgresql 现在存在现有 id 的问题:我不清楚它从哪里获得用于确定 nextval 基数的值:它肯定不是最高的列中的值,尽管您可能认为这是个好主意。无论如何,它现在与现有的 id 值发生冲突。从标准 RoR 迁移创建的 id 列定义为

not null default nextval('geopoints_id_seq'::regclass)

它用作基础的值是否可以在某些地方被黑客入侵?这个问题现在可能出现在 20 个左右的表中:我可以使用

'select max(id) from <table_name>' 

但这似乎使自动增量列的想法变得毫无意义。

如何最好地处理这个问题?

最佳答案

Postgres adapter 上有一个reset_pk_sequences! 方法.您可以调用它,它会将其设置为 max(id) + 1,这可能就是您想要的。

在某些项目中,我经常获取足够多的 ETL 数据,以保证对所有模型或特定模型执行此任务的 rake 任务。这是任务 - 将它包含在一些 Rakefile 中或它自己的 lib/tasks 下:

desc "Reset all sequences. Run after data imports"
task :reset_sequences, :model_class, :needs => :environment do |t, args|
if args[:model_class]
classes = Array(eval args[:model_class])
else
puts "using all defined active_record models"
classes = []
Dir.glob(RAILS_ROOT + '/app/models/**/*.rb').each { |file| require file }
Object.subclasses_of(ActiveRecord::Base).select { |c|
c.base_class == c}.sort_by(&:name).each do |klass|
classes << klass
end
end
classes.each do |klass|
next if klass == CGI::Session::ActiveRecordStore::Session && ActionController::Base.session_store.to_s !~ /ActiveRecordStore/

puts "reseting sequence on #{klass.table_name}"
ActiveRecord::Base.connection.reset_pk_sequence!(klass.table_name)
end
end

现在您可以使用 rake reset_sequences 为所有模型(在 RAIS_ROOT/app/models 下定义)运行它,或者通过传入类名为特定模型运行它。

关于ruby-on-rails - postgresql nextval 生成现有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1709705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com