问题总结:
我克隆了一个名为 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
额外问题:
+ add_index "annotations", ["org_id"], name: "fk_rails_aca7521f72", using: :btree
?以前不在这里您的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 以另一种方式做事。
我需要的不仅仅是评论来澄清一些评论者的一些事情,所以这里是。
看起来btree
MariaDB 支持索引(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_584be190c2
。FK 通常具有与其相关联的索引,以有效地检查参照完整性。也许 ActiveRecord/MariaDB 会自动创建它们,也许 MariaDB 会自己做。我不是 MySQL 或 MariaDB 专家,所以我不知道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句