问题摘要:
我克隆了一个名为DMP路线图的开源项目,并遵循其安装指南直到rake db:schema:load。
然后我做了rake db:migrate,它在终端中没有输出,但是我注意到schema.rb文件被修改了。我认为这不应该发生,因为rake db:migrate不会产生任何输出,这应该意味着什么都不会改变,但是模式文件是被更改的。
下面一定有什么事情发生了,谁知道DB迁移的来龙去脉,请解释一下下面发生了什么?
复制的步骤:
在Mac上,brew安装mariadb (brew info mariadb会说:稳定的10.3.9 (瓶装))
遵循安装指南
git clone https://github.com/DMPRoadmap/roadmap.git
cd roadmap
cp config/database_example.yml config/database.yml
cp config/secrets_example.yml config/secrets.yml
cp config/branding_example.yml config/branding.yml
cp config/initializers/devise.rb.example config/initializers/devise.rb
cp config/initializers/recaptcha.rb.example config/initializers/recaptcha.rb
cp config/initializers/wicked_pdf.rb.example config/initializers/wicked_pdf.rb
bundle install
rake secret
vi config/secrets.yml # put the secret generated above into `config/secret.yml`
rake db:create
rake db:schema:load
rake db:migrate执行rake db:migrate**:**后的git差异的部分
ActiveRecord::Schema.define(version: 20180508151824) do
create_table "annotations", force: :cascade do |t|
- t.integer "question_id"
- t.integer "org_id"
- t.text "text"
- t.integer "type", default: 0, null: false
+ t.integer "question_id", limit: 4
+ t.integer "org_id", limit: 4
+ t.text "text", limit: 65535
+ t.integer "type", limit: 4, default: 0, null: false
t.datetime "created_at"
t.datetime "updated_at"
end
- add_index "annotations", ["question_id"], name: "index_annotations_on_question_id"
+ add_index "annotations", ["org_id"], name: "fk_rails_aca7521f72", using: :btree
+ add_index "annotations", ["question_id"], name: "index_annotations_on_question_id", using: :btree
create_table "answers", force: :cascade do |t|
- t.text "text"
- t.integer "plan_id"
- t.integer "user_id"
- t.integer "question_id"
+ t.text "text", limit: 65535
+ t.integer "plan_id", limit: 4
+ t.integer "user_id", limit: 4
+ t.integer "question_id", limit: 4
t.datetime "created_at"
t.datetime "updated_at"
- t.integer "lock_version", default: 0
+ t.integer "lock_version", limit: 4, default: 0
end
- add_index "answers", ["plan_id"], name: "index_answers_on_plan_id"
- add_index "answers", ["question_id"], name: "index_answers_on_question_id"
+ add_index "answers", ["plan_id"], name: "index_answers_on_plan_id", using: :btree
+ add_index "answers", ["question_id"], name: "index_answers_on_question_id", using: :btree
+ add_index "answers", ["user_id"], name: "fk_rails_584be190c2", using: :btree
create_table "answers_question_options", id: false, force: :cascade do |t|
- t.integer "answer_id", null: false额外问题:
+ add_index "annotations", ["org_id"], name: "fk_rails_aca7521f72", using: :btree?以前不在这里发布于 2018-08-16 06:02:14
您的db/schema.rb文件表示Rails所看到的数据库的结构。每当您做任何可能更改数据库的操作时,Rails都会查询数据库的当前结构,并将该结构写入db/schema.rb。
Rails无法知道迁移是否会改变数据库的结构。如果您只使用通常的迁移助手,那么理论上它可以知道模式是否发生了变化,但是始终存在将SQL直接发送到数据库的connection.execute。构建schema.rb相对较快,所以最简单(也是最明智)的解决方案是在每次rake db:migrate时重新构建它。
从以下方面的变化:
t.integer "question_id"至
t.integer "question_id", limit: 4建议最初的schema.rb来自PostgreSQL (不支持整数列上的:limit选项),而您的来自MariaDB (在整数列上有:limit)。其他更改有相同的来源: PostgreSQL以一种方式执行,而MariaDB则以另一种方式执行。
我需要更多的评论来澄清一些事情,为一些评论者,因此,这里。
看起来,btree索引是由MariaDB支持的( MySQL的叉子用来防止甲骨文),在这种特殊情况下,fk_rails_584be190c2名称表明它与MariaDB (或ActiveRecord与MariaDB)如何处理外键有关。如果你看看schema.rb
add_foreign_key "annotations", "orgs"
...
add_foreign_key "answers", "users"
...answers.users上的FK匹配名为fk_rails_584be190c2的btree索引。FKs通常有与它们相关联的索引,以提高检查引用完整性的效率。也许ActiveRecord/MariaDB会自动创建它们,也许MariaDB是自己创建的。我不是MySQL或MariaDB专家,所以我不知道。
https://stackoverflow.com/questions/51870124
复制相似问题