我正在使用postgresql使用现有的rails应用程序。它的schema.rb文件有许多(但不是全部)表的id: :serial
:
create_table "foos", id: :serial, force: :cascade do |t|
当我运行rails db:migrate:reset
时,id: :serial
被删除。我们都是相同版本的postgres,但不同的操作系统。我没有详尽地测试机器之间的行为,但我认为机器之间存在差异。
rails版本与项目启动时的版本相同。
该项目确实以sqlite3开头。当我切换到那个并重新生成文件时,行为相同。
什么可能导致在我的环境中删除此选项?
这里有一些可能相关的代码:
更新
rails db:migrate:reset
,我错了!他们的环境也删除id: :serial
。id: :serial
。当你运行rails db:migrate:reset
而不是rails db:reset
时,数据库模式不会从schema.rb
加载,而是从所有迁移中重建。在迁移和模式文件中,您无需指定id
字段,默认情况下会提供一个字段。然而,从Rails 5.1开始,default size of the id field was increased从INT
到BIGINT
用于MySQL,从SERIAL
到BIGSERIAL
用于PostgreSQL。因此,您的迁移,schema.rb
和数据库中的实际模式之间可能存在一些交互,导致id字段在某些情况下被视为默认(并省略)并在其他情况下明确指定,这仅仅是由于默认大小。如果没有看到所有相关文件,很难猜测问题的根源。
答案只是rails 5.0 vs 5.1迁移。我以前认为该项目是从5.1开始的,所以我没有测试过。但后来我深入挖掘并发现它始于5.0,实验表明这就是答案。
class SerialIdTest < ActiveRecord::Migration[5.0]
def change
create_table "test" do |t|
t.integer "foo_id"
t.string "foo_role"
end
end
end
create_table "test", id: :serial, force: :cascade do |t|
t.integer "foo_id"
t.string "foo_role"
end
# \d test
Table "public.test"
Column | Type | Modifiers
------------------+-------------------+-------------------------------------------------------
id | integer | not null default nextval('test_id_seq'::regclass)
foo_id | integer |
foo_role | character varying |
Indexes:
"test_pkey" PRIMARY KEY, btree (id)
class SerialIdTest < ActiveRecord::Migration[5.1]
def change
create_table "test" do |t|
t.integer "foo_id"
t.string "foo_role"
end
end
end
create_table "test", force: :cascade do |t|
t.integer "foo_id"
t.string "foo_role"
end
# \d test
Table "public.test"
Column | Type | Modifiers
------------------+-------------------+-------------------------------------------------------
id | bigint | not null default nextval('test_id_seq'::regclass)
foo_id | integer |
foo_role | character varying |
Indexes:
"test_pkey" PRIMARY KEY, btree (id)
class SerialIdTest < ActiveRecord::Migration[5.1]
def change
create_table "test", id: :serial do |t|
t.integer "foo_id"
t.string "foo_role"
end
end
end
create_table "test", id: :serial, force: :cascade do |t|
t.integer "foo_id"
t.string "foo_role"
end
# \d test
Table "public.test"
Column | Type | Modifiers
------------------+-------------------+-------------------------------------------------------
id | integer | not null default nextval('test_id_seq'::regclass)
foo_id | integer |
foo_role | character varying |
Indexes:
"test_pkey" PRIMARY KEY, btree (id)