Wil*_*ckl 4 postgresql activerecord ruby-on-rails
我和这篇文章有同样的问题。但我正在使用 Rails,不知道如何在 activerecord 中执行此解决方法。
我正在使用seeds.rb 插入一些数据:
device_platforms = DevicePlatform.create([{id: 1, name: 'Android'}, {id: 2, name: 'IOS'}, {id: 3, name: 'Windows Phone'}])
Run Code Online (Sandbox Code Playgroud)
当我插入另一个 DevicePlatform 时,出现此异常:
Failure/Error: @device_platform = FactoryGirl.create(:device_platform)
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERRO: duplicar valor da chave viola a restrição de unicidade "device_platforms_pkey"
DETAIL: Chave (id)=(2) já existe.
: INSERT INTO "device_platforms" ("created_at", "name", "updated_at") VALUES ($1, $2, $3) RETURNING "id"
Run Code Online (Sandbox Code Playgroud)
该消息是葡萄牙语,表示具有该 ID 的行已经存在。
谢谢。
我相信虽然这是一个坏习惯,但很多时候它是唯一的手段
您可以定义此方法:
def fix_self_increment(model)
ActiveRecord::Base.connection.execute(
"BEGIN; " \
"LOCK TABLE #{model.table_name} IN EXCLUSIVE MODE; " \
"SELECT setval('#{model.table_name}_id_seq', COALESCE((SELECT MAX(id)+1 FROM #{model.table_name}), 1), false); " \
"COMMIT;"
)
end
Run Code Online (Sandbox Code Playgroud)
然后打电话
fix_self_increment(DevicePlatform)
Run Code Online (Sandbox Code Playgroud)
享受