如果我在 `rake db:schema:load` 之后立即运行 `rake db:migrate`,为什么 schema.rb 会被修改?

亨利·杨

问题总结:

我克隆了一个名为 DMP Roadmap 的开源项目,并按照其安装指南进行操作,直到rake db:schema:load.

然后我rake db:migrate在终端中产生任何输出,但我注意到 schema.rb 文件被修改了。我认为这不应该发生,因为rake db:migrate不会产生任何输出,这意味着不会发生任何更改,但架构文件已更改。

下面一定有什么事情发生了,任何了解数据库迁移来龙去脉的人都可以解释一下下面发生了什么吗?

重现步骤:

在 Mac OS 上, brew install mariadb (brew info mariadb会说: stable 10.3.9 (bottled))

按照安装指南

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

执行后的 git diff 的一部分rake db:migrate

 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

额外问题:

  • 为什么要加一堆limit和btree呢?
  • 为什么要添加这一行:+ add_index "annotations", ["org_id"], name: "fk_rails_aca7521f72", using: :btree以前不在这里
mu 太短

您的db/schema.rb文件代表了 Rails 看到的数据库结构。任何时候你做任何可能改变数据库的事情,Rails 都会查询数据库的当前结构并将该结构写入db/schema.rb.

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

变化来自:

t.integer  "question_id"

t.integer  "question_id", limit: 4

表明原始schema.rb来自 PostgreSQL(它不支持:limit整数列上选项)但你的来自 MariaDB(它:limit在整数列上有s)。其他更改具有相同的来源:PostgreSQL 以一种方式做事,MariaDB 以另一种方式做事。


我需要的不仅仅是评论来澄清一些评论者的一些事情,所以这里是。

看起来btreeMariaDB 支持索引(MySQL 的一个分支,使 Oracle 远离),在这种特定情况下,该fk_rails_584be190c2名称表明它与 MariaDB(或带有 MariaDB 的 ActiveRecord)处理外键的方式有关。如果你看一下原文schema.rb底部

add_foreign_key "annotations", "orgs"
...
add_foreign_key "answers", "users"
...

FK onanswers.users匹配名为 的 btree 索引fk_rails_584be190c2FK 通常具有与其相关联的索引,以有效地检查参照完整性。也许 ActiveRecord/MariaDB 会自动创建它们,也许 MariaDB 会自己做。我不是 MySQL 或 MariaDB 专家,所以我不知道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rake db:setup无法运行rails db:migrate,schema.rb不存在错误

来自分类Dev

rake db:schema:load未填充schema_migrations表

来自分类Dev

升级到Rails 4.2.6:rake db:migrate将列限制插入schema.rb

来自分类Dev

为什么执行rake db:schema:load时,SimpleCov会触发?

来自分类Dev

如何使rake db:schema:dump具有schema.rb中字段的字符集和排序规则?

来自分类Dev

Rails Rake db:schema:load在新数据库中失败

来自分类Dev

rake db:schema:load在开发中有效,但在生产中无效

来自分类Dev

heroku运行rake db:migrate ... rake中止了!找不到Rakefile

来自分类Dev

我如何使用rake db:dump:schema转储多个postgres模式

来自分类Dev

heroku运行rake db:migrate还原迁移

来自分类Dev

capistrano 3`rake db:migrate`仍然运行

来自分类Dev

如何使用Sidekiq运行Rake db:migrate

来自分类Dev

奇怪的rake db:migrate输出

来自分类Dev

Rake db:migrate捕获错误

来自分类Dev

ExceptionNotifier和rake:db:migrate

来自分类Dev

rake db:migrate有什么错误?

来自分类Dev

rails 4-每当我运行rake db:migrate命令时,rake命令都会显示弃用警告

来自分类Dev

为什么“ rake route”命令还运行工厂内部的rake db:seed命令?

来自分类Dev

在每种情况之前,在黄瓜中运行exec'rake db:drop db:create db:migrate db:seed'

来自分类Dev

db:schema:load如何影响未来的db:migrate操作

来自分类Dev

Rails-在rake db:migrate之后添加默认值

来自分类Dev

Rails-在rake db:migrate之后添加默认值

来自分类Dev

rake db:schema:dump不会为所有数据库生成模式

来自分类Dev

`rake db:schema:dump`创建带有空系统表的模式

来自分类Dev

`rake db:schema:dump`创建带有空系统表的模式

来自分类Dev

为什么Rails要求我一次又一次运行rake db:migrate RAILS_ENV = test?

来自分类Dev

在rake db:migrate后未定义符号rb_str2cstr

来自分类Dev

heroku在heroku中运行rake db:migrate:status吗?

来自分类Dev

rake db:migrate由于rake版本差异而被中止

Related 相关文章

  1. 1

    Rake db:setup无法运行rails db:migrate,schema.rb不存在错误

  2. 2

    rake db:schema:load未填充schema_migrations表

  3. 3

    升级到Rails 4.2.6:rake db:migrate将列限制插入schema.rb

  4. 4

    为什么执行rake db:schema:load时,SimpleCov会触发?

  5. 5

    如何使rake db:schema:dump具有schema.rb中字段的字符集和排序规则?

  6. 6

    Rails Rake db:schema:load在新数据库中失败

  7. 7

    rake db:schema:load在开发中有效,但在生产中无效

  8. 8

    heroku运行rake db:migrate ... rake中止了!找不到Rakefile

  9. 9

    我如何使用rake db:dump:schema转储多个postgres模式

  10. 10

    heroku运行rake db:migrate还原迁移

  11. 11

    capistrano 3`rake db:migrate`仍然运行

  12. 12

    如何使用Sidekiq运行Rake db:migrate

  13. 13

    奇怪的rake db:migrate输出

  14. 14

    Rake db:migrate捕获错误

  15. 15

    ExceptionNotifier和rake:db:migrate

  16. 16

    rake db:migrate有什么错误?

  17. 17

    rails 4-每当我运行rake db:migrate命令时,rake命令都会显示弃用警告

  18. 18

    为什么“ rake route”命令还运行工厂内部的rake db:seed命令?

  19. 19

    在每种情况之前,在黄瓜中运行exec'rake db:drop db:create db:migrate db:seed'

  20. 20

    db:schema:load如何影响未来的db:migrate操作

  21. 21

    Rails-在rake db:migrate之后添加默认值

  22. 22

    Rails-在rake db:migrate之后添加默认值

  23. 23

    rake db:schema:dump不会为所有数据库生成模式

  24. 24

    `rake db:schema:dump`创建带有空系统表的模式

  25. 25

    `rake db:schema:dump`创建带有空系统表的模式

  26. 26

    为什么Rails要求我一次又一次运行rake db:migrate RAILS_ENV = test?

  27. 27

    在rake db:migrate后未定义符号rb_str2cstr

  28. 28

    heroku在heroku中运行rake db:migrate:status吗?

  29. 29

    rake db:migrate由于rake版本差异而被中止

热门标签

归档