这里有一个非常简单的问题——如果随着应用程序变得更复杂,迁移会变得缓慢和麻烦,如果我们有更干净的rake db:schema:load
来调用,为什么迁移存在呢?
如果上面的答案是迁移用于版本控制(对数据库的更改的逐步记录),那么当应用程序变得更复杂并且rake db:schema:load
被更多地使用时,它们是否继续保持其主要功能?
注意:
从这个问题的答案来看:rake db:schema:load
将删除生产服务器上的数据,所以在使用它时要小心。
迁移为数据库提供向前和向后的步骤更改。在生产环境中,必须在部署期间对数据库进行增量更改:迁移为该功能提供了回滚故障保护。如果在生产服务器上运行rake db:schema:load
,最终将删除所有生产数据。这是一个很危险的习惯。
话虽这么说,我认为偶尔"崩溃"迁移是一个不错的做法。这需要删除旧的迁移,用单个迁移(非常类似于您的schema.rb
文件)替换它们,并更新schema_migrations
表以反映此更改。这样做的时候要非常小心!如果你不小心,你可以很容易地删除你的生产数据。
作为旁注,我强烈认为您永远不应该在迁移文件中创建数据。seed.rb
文件可用于此,也可用于自定义rake或deploy任务。将其放入迁移文件中会使数据库模式规范与数据规范混淆,并且在运行迁移文件时可能导致冲突。
偶然看到这篇帖子,那是很久以前的事了,没有看到我期待的答案。
rake db:schema:load
对于第一次将系统投入生产非常有用。在此之后,您应该正常运行迁移。
这还可以帮助您随时清理迁移,因为即使在清理迁移时,模式也拥有将其他机器投入生产的所有信息。
Migrations也允许您向数据库添加数据。但是db:schema:load只加载模式
因为迁移可以回滚,并提供额外的功能。例如,如果您需要修改一些数据作为模式更改的一部分,那么您需要将其作为迁移来执行。
作为其他ORM的用户,Rails没有'同步和更新'功能总是让我感到奇怪。即,通过使用模式文件(它代表了整个最新的模式),遍历现有的数据库结构,并根据需要添加/删除表,列,索引。
对我来说,这将更加健壮,即使可能有点慢。
我已经发布了一个评论,但感觉最好把db/schema的评论。
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
实际上,我的经验是,最好把迁移文件放在git中,而不是模式中。rb文件…
rake db:migrate
在数据库中设置表。当您运行迁移命令时,它将在db/migrate/中查找所有ruby文件,并从最早的文件开始执行。在每个迁移文件名的开头都有一个时间戳。
不像rake db:migrate
会运行尚未运行的迁移,rake db:schema:load
会将db/schema.rb
中已经生成的模式加载到数据库中。
您可以在这里找到更多关于rake数据库命令的信息。
所以schema:load获取当前配置的模式,派生相关的查询来匹配,并一次运行它们。这是一种一次性的情况。正如您所看到的,迁移一步一步地进行更改。在本地处理项目时,特别是在项目生命周期的早期,加载模式可能是有意义的。但是,如果每次进行部署时都删除并重新创建生产数据库,那么每次都会丢失生产数据。那是不行的。这就是为什么我们使用迁移来对现有数据库进行所需的更改。
。项目越深入,对DB进行的更改越多,就会堆积越多的迁移。随着每次迁移的进行,这些迁移越来越成为生产环境中的真实情况的来源——重要的不是模式中有什么,而是在生产环境中运行了哪些迁移。如果两者同步,差异实际上就没有意义了。但是一旦其中一个过时了,你就开始有差异了。理想情况下,这种情况不会发生,但我们生活在现实世界中,事情总会发生。如果您使用schema:load在本地设置DB,那么您可能无法获得DB的实际状态,因为它是通过生产中的迁移历史记录反映出来的。
rake db:schema:load用于从模式中创建数据库模式。rb文件。这一模式。rb文件是数据库模式在Ruby代码中的表示。该命令通常在设置新数据库或需要重新启动时使用。
另一方面,rake db:migrate用于将新的数据库迁移应用到现有的数据库。数据库迁移用于随着时间的推移对数据库模式进行更改。这些更改可以包括创建新表、修改现有表或向现有表添加新列。