这里有一个非常简单的问题--如果随着应用程序变得越来越复杂,迁移会变得缓慢和繁琐,如果我们有更干净的rake db:schema:load
来调用,为什么还要迁移呢?
如果上述问题的答案是迁移用于版本控制(逐步记录数据库的更改),那么随着应用程序变得越来越复杂,rake db:schema:load
被更多地使用,它们是否继续保持其主要功能?
注意:
从这个问题的答案来看:rake db:schema:load
将删除生产服务器上的数据,因此使用时请小心。
这里有一个非常简单的问题--如果随着应用程序变得越来越复杂,迁移会变得缓慢和繁琐,如果我们有更干净的rake db:schema:load
来调用,为什么还要迁移呢?
如果上述问题的答案是迁移用于版本控制(逐步记录数据库的更改),那么随着应用程序变得越来越复杂,rake db:schema:load
被更多地使用,它们是否继续保持其主要功能?
从这个问题的答案来看:rake db:schema:load
将删除生产服务器上的数据,因此使用时请小心。
9条答案
按热度按时间dxpyg8gm1#
迁移提供了对数据库的向前和向后分步更改。在生产环境中,必须在部署期间对数据库进行增量更改:迁移通过回滚故障保护提供了此功能。如果您在生产服务器上运行
rake db:schema:load
,则最终将删除所有生产数据。这是一个危险的习惯。话虽如此,我认为偶尔“折叠”迁移是一种不错的做法。这需要删除旧的迁移,用单个迁移(非常类似于您的
schema.rb
文件)替换它们,并更新schema_migrations
表以反映此更改。执行此操作时要非常小心!如果不小心,您可以轻松删除生产数据。顺便说一句,我强烈认为你不应该把数据创建放在迁移文件中。
seed.rb
文件可以用于此,或者自定义rake或deploy任务。把它放在迁移文件中会混淆数据库模式规范和数据规范,并且在运行迁移文件时可能导致冲突。qnakjoqk2#
只是偶然发现了这篇文章,那是很久以前的事了,没有看到我所期待的答案。
rake db:schema:load
非常适合您第一次将系统投入生产环境。之后您应该正常运行迁移。这也有助于您随时清理迁移,因为即使您清理了迁移,模式也包含了将其他机器投入生产的所有信息。
iqih9akk3#
迁移也允许您将数据添加到数据库中。但是db:schema:load只加载模式。
nhn9ugyo4#
因为迁移可以回滚,并提供额外的功能。例如,如果您需要修改一些数据作为架构更改的一部分,那么您需要将其作为迁移来执行。
oipij1gg5#
作为其他ORM的用户,Rails没有“同步和更新”功能对我来说总是很奇怪。也就是说,通过使用模式文件(代表整个最新的模式),遍历现有的DB结构,并根据需要添加/删除表,列,索引。
对我来说,这将是一个更强大的,即使可能有点慢。
snvhrwxg6#
我已经以评论的形式发表了文章,但我觉得最好把db/schema.rb文件的评论放在这里:
实际上,我的经验是,最好将迁移文件放在git中,而不是schema.rb文件中。
8fsztsew7#
rake db:migrate
在数据库中设置表。当您运行迁移命令时,它将在db/migrate/中查找任何ruby文件,并从最旧的文件开始执行。每个迁移文件名的开头都有一个时间戳。与运行尚未运行的迁移的
rake db:migrate
不同,rake db:schema:load
将已经在db/schema.rb
中生成的模式加载到数据库中。您可以了解更多关于rake database commands here的信息。
vx6bjr1n8#
所以schema:load获取当前配置的schema,派生要匹配的关联查询,并一次性运行它们。这是一种一次性完成的情况。正如您所看到的,迁移会逐步进行更改。在本地处理项目时,加载schema可能是有意义的,特别是在项目生命周期的早期。但是如果我们每次进行部署时都要删除并重新创建生产数据库,我们每次都会丢失生产数据。这是行不通的。这就是为什么我们使用迁移来对现有数据库进行所需的更改。
所以。项目越深入,随着对数据库的更改越多,您将获得越多的迁移。随着每次迁移,这些迁移越来越成为生产中内容的真实来源-重要的不是模式中的内容,而是在生产环境中运行了哪些迁移。如果我们使两者同步,则差异实际上是没有意义的。但是一旦一个从另一个过时,理想情况下,这种情况不会发生,但我们生活在真实的世界中,事情会发生。如果您使用schema:load在本地设置数据库,您可能无法获得数据库的实际状态,因为它通过生产上的迁移历史反映出来。
3npbholx9#
rake db:schema:load用于从schema.rb文件创建数据库模式。schema.rb文件是Ruby代码中数据库模式的表示。此命令通常在设置新数据库或需要重新启动时使用。
另一方面,rake db:migrate用于将新数据库迁移应用到现有数据库。数据库迁移用于随着时间的推移对数据库架构进行更改。这些更改可以包括创建新表、修改现有表或向现有表添加新列。