首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我在‘schema:schema:load`’之后立即运行`schema: schema.rb‘,那么为什么要修改呢?

如果我在‘schema:schema:load`’之后立即运行`schema: schema.rb‘,那么为什么要修改呢?
EN

Stack Overflow用户
提问于 2018-08-16 05:27:03
回答 1查看 513关注 0票数 0

问题摘要:

我克隆了一个名为DMP路线图的开源项目,并遵循其安装指南直到rake db:schema:load

然后我做了rake db:migrate,它在终端中没有输出,但是我注意到schema.rb文件被修改了。我认为这不应该发生,因为rake db:migrate不会产生任何输出,这应该意味着什么都不会改变,但是模式文件是被更改的。

下面一定有什么事情发生了,谁知道DB迁移的来龙去脉,请解释一下下面发生了什么?

复制的步骤:

在Mac上,brew安装mariadb (brew info mariadb会说:稳定的10.3.9 (瓶装))

遵循安装指南

代码语言:javascript
复制
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差异的部分

代码语言:javascript
复制
 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?以前不在这里
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 06:02:14

您的db/schema.rb文件表示Rails所看到的数据库的结构。每当您做任何可能更改数据库的操作时,Rails都会查询数据库的当前结构,并将该结构写入db/schema.rb

Rails无法知道迁移是否会改变数据库的结构。如果您只使用通常的迁移助手,那么理论上它可以知道模式是否发生了变化,但是始终存在将SQL直接发送到数据库的connection.execute。构建schema.rb相对较快,所以最简单(也是最明智)的解决方案是在每次rake db:migrate时重新构建它。

从以下方面的变化:

代码语言:javascript
复制
t.integer  "question_id"

代码语言:javascript
复制
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

代码语言:javascript
复制
add_foreign_key "annotations", "orgs"
...
add_foreign_key "answers", "users"
...

answers.users上的FK匹配名为fk_rails_584be190c2的btree索引。FKs通常有与它们相关联的索引,以提高检查引用完整性的效率。也许ActiveRecord/MariaDB会自动创建它们,也许MariaDB是自己创建的。我不是MySQL或MariaDB专家,所以我不知道。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51870124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档