是什么决定了rails在表定义中是否包含id :: serial?

Joh*_*hir 13 postgresql ruby-on-rails rails-migrations

我正在使用postgresql使用现有的rails应用程序.它的schema.rb文件包含id: :serial许多(但不是全部)表:

create_table "foos", id: :serial, force: :cascade do |t|
Run Code Online (Sandbox Code Playgroud)

当我跑rails db:migrate:reset,id: :serial被删除.我们都是相同版本的postgres,但不同的操作系统.我没有详尽地测试机器之间的行为,但我认为机器之间存在差异.

rails版本与项目启动时的版本相同.

该项目确实以sqlite3开头.当我切换到那个并重新生成文件时,行为相同.

什么可能导致在我的环境中删除此选项?

这里有一些可能相关的代码:

更新

  • 我刚试过rails db:migrate:reset同事的机器,我错了!他们的环境也会删除id: :serial.
  • 我仔细看了一下同事最近的迁移,最近的一次也没有id: :serial在schema.rb中创建.

Old*_*Pro 7

rails db:migrate:reset与相对运行时rails db:reset,数据库架构不会从中加载,schema.rb而是从所有迁移中重建。在迁移和模式文件中,您无需指定id字段,默认情况下会提供一个字段。然而,开始使用Rails 5.1中,id字段的默认大小增加INTBIGINTMySQL和从SERIALBIGSERIALPostgreSQL的。因此,您的迁移之间可能存在一些互动,schema.rb,以及在数据库中导致id字段的实际架构在某些情况下被视为默认值(并省略了),而在其他情况下,正是由于默认大小的更改而被明确指定。如果不查看所有相关文件,很难猜测问题的根源。


Joh*_*hir 7

答案很简单,就是Rails 5.0与5.1的迁移。我以前认为该项目始于5.1,所以我没有对此进行测试。但是后来我更深入地研究,发现它从5.0开始,实验表明这就是答案。

5.0,未指定ID

class SerialIdTest < ActiveRecord::Migration[5.0]
  def change
    create_table "test" do |t|
      t.integer "foo_id"
      t.string "foo_role"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)
create_table "test", id: :serial, force: :cascade do |t|
  t.integer "foo_id"
  t.string "foo_role"
end
Run Code Online (Sandbox Code Playgroud)
# \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)
Run Code Online (Sandbox Code Playgroud)

5.1,未指定编号

# \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)
Run Code Online (Sandbox Code Playgroud)
class SerialIdTest < ActiveRecord::Migration[5.1]
  def change
    create_table "test" do |t|
      t.integer "foo_id"
      t.string "foo_role"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)
# \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)
Run Code Online (Sandbox Code Playgroud)

5.1,指定了id序列号

create_table "test", force: :cascade do |t|
  t.integer "foo_id"
  t.string "foo_role"
end
Run Code Online (Sandbox Code Playgroud)
# \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)
Run Code Online (Sandbox Code Playgroud)
# \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)
Run Code Online (Sandbox Code Playgroud)