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

Ruby on rails 什么决定rails在表定义中是否包含id::serial?,ruby-on-rails,postgresql,rails-migrations,Ruby On Rails,Postgresql,Rails Migrations,我正在使用现有的rails应用程序,使用postgresql。它的schema.rb文件具有id::serial用于许多(但不是所有)表: create_table "foos", id: :serial, force: :cascade do |t| 当我运行railsdb:migrate:reset时,id::serial被删除。我们都使用同一版本的postgres,但操作系统不同。我没有详尽地测试机器之间的行为,但我认为机器之间是有区别的 rails版本与项目启动时的版本相同 该项目确实

我正在使用现有的rails应用程序,使用postgresql。它的schema.rb文件具有
id::serial
用于许多(但不是所有)表:

create_table "foos", id: :serial, force: :cascade do |t|
当我运行
railsdb:migrate:reset
时,
id::serial
被删除。我们都使用同一版本的postgres,但操作系统不同。我没有详尽地测试机器之间的行为,但我认为机器之间是有区别的

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

该项目确实是从sqlite3开始的。当我切换到该选项并重新生成文件时,会出现相同的行为

是什么原因导致此选项在我的环境中被删除

下面是一些可能相关的代码:

更新

  • 我刚刚在同事的机器上尝试了
    railsdb:migrate:reset
    ,但我错了!他们的环境也删除了
    id::serial
  • 我仔细观察了同事最近的迁移,最近的迁移也没有在schema.rb中创建
    id::serial

当您运行
rails db:migrate:reset
而不是
rails db:reset
时,数据库架构不会从
schema.rb加载,而是从所有迁移中重新构建。在迁移和架构文件中,您不需要指定
id
字段,默认情况下会提供一个字段。但是,从Rails 5.1开始,MySQL的from
INT
BIGINT
,PostgreSQL的from
SERIAL
BIGSERIAL
。因此,您的迁移,
schema.rb
,和数据库中的实际模式之间可能存在某种交互作用,导致id字段在某些情况下被视为默认值(并省略),而在其他情况下被显式指定,这仅仅是由于默认大小的更改。在没有看到所有相关文件的情况下,很难猜测问题的根源

答案就是rails 5.0与5.1的迁移。我以前认为这个项目是从5.1开始的,所以我没有测试这个。但后来我深入研究,发现它是从5.0开始的,实验表明这就是答案

5.0,未指定id
class SerialIdTest
create_table“test”,id::serial,force::cascade do | t|
t、 整数“foo_id”
t、 字符串“foo_角色”
结束
5.1,未指定id
classserialidtest
create_table“test”,force::cascade do | t|
t、 整数“foo_id”
t、 字符串“foo_角色”
结束
5.1,指定的序列号
classserialidtest
create_table“test”,id::serial,force::cascade do | t|
t、 整数“foo_id”
t、 字符串“foo_角色”
结束

那是什么版本?似乎
id::serial
是postgres+rails 5.1的新增版本。版本9.6。我所有的实验都使用rails 5.1。在某些环境中,添加了id::serial。在其他国家,情况并非如此。我需要更多信息。删除
id::serial
是什么意思?表不再有主键了吗?表定义(
\d foos
)在前后是什么样子的。还请发布您的
schema.rb
structure.sql
文件(以存在的文件为准)。@OldPro在问题中,那一行来自我的schema.rb文件。每张桌子一张。这就是我的项目中由其他开发人员生成的文件的方式。当我在我的环境中重新生成文件时(vagrant,ubuntu xenial,对配置没有明显的更改),所有
,id::serial
的实例都被删除了。我找到了答案——请看我的答案。谢谢你的努力!对于其他人来说,这个答案比公认的答案更有帮助,谢谢你发布它。
# \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)
# \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)
# \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)