ruby-on-rails rake db:schema:load与migrations

xoshrz7s  于 2023-04-08  发布在  Ruby
关注(0)|答案(9)|浏览(193)

这里有一个非常简单的问题--如果随着应用程序变得越来越复杂,迁移会变得缓慢和繁琐,如果我们有更干净的rake db:schema:load来调用,为什么还要迁移呢?
如果上述问题的答案是迁移用于版本控制(逐步记录数据库的更改),那么随着应用程序变得越来越复杂,rake db:schema:load被更多地使用,它们是否继续保持其主要功能?

注意:

从这个问题的答案来看:rake db:schema:load将删除生产服务器上的数据,因此使用时请小心。

dxpyg8gm

dxpyg8gm1#

迁移提供了对数据库的向前和向后分步更改。在生产环境中,必须在部署期间对数据库进行增量更改:迁移通过回滚故障保护提供了此功能。如果您在生产服务器上运行rake db:schema:load,则最终将删除所有生产数据。这是一个危险的习惯。
话虽如此,我认为偶尔“折叠”迁移是一种不错的做法。这需要删除旧的迁移,用单个迁移(非常类似于您的schema.rb文件)替换它们,并更新schema_migrations表以反映此更改。执行此操作时要非常小心!如果不小心,您可以轻松删除生产数据。
顺便说一句,我强烈认为你不应该把数据创建放在迁移文件中。seed.rb文件可以用于此,或者自定义rake或deploy任务。把它放在迁移文件中会混淆数据库模式规范和数据规范,并且在运行迁移文件时可能导致冲突。

qnakjoqk

qnakjoqk2#

只是偶然发现了这篇文章,那是很久以前的事了,没有看到我所期待的答案。
rake db:schema:load非常适合您第一次将系统投入生产环境。之后您应该正常运行迁移。
这也有助于您随时清理迁移,因为即使您清理了迁移,模式也包含了将其他机器投入生产的所有信息。

iqih9akk

iqih9akk3#

迁移也允许您将数据添加到数据库中。但是db:schema:load只加载模式。

nhn9ugyo

nhn9ugyo4#

因为迁移可以回滚,并提供额外的功能。例如,如果您需要修改一些数据作为架构更改的一部分,那么您需要将其作为迁移来执行。

oipij1gg

oipij1gg5#

作为其他ORM的用户,Rails没有“同步和更新”功能对我来说总是很奇怪。也就是说,通过使用模式文件(代表整个最新的模式),遍历现有的DB结构,并根据需要添加/删除表,列,索引。
对我来说,这将是一个更强大的,即使可能有点慢。

snvhrwxg

snvhrwxg6#

我已经以评论的形式发表了文章,但我觉得最好把db/schema.rb文件的评论放在这里:

# 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中,而不是schema.rb文件中。

8fsztsew

8fsztsew7#

rake db:migrate在数据库中设置表。当您运行迁移命令时,它将在db/migrate/中查找任何ruby文件,并从最旧的文件开始执行。每个迁移文件名的开头都有一个时间戳。
与运行尚未运行的迁移的rake db:migrate不同,rake db:schema:load将已经在db/schema.rb中生成的模式加载到数据库中。
您可以了解更多关于rake database commands here的信息。

vx6bjr1n

vx6bjr1n8#

所以schema:load获取当前配置的schema,派生要匹配的关联查询,并一次性运行它们。这是一种一次性完成的情况。正如您所看到的,迁移会逐步进行更改。在本地处理项目时,加载schema可能是有意义的,特别是在项目生命周期的早期。但是如果我们每次进行部署时都要删除并重新创建生产数据库,我们每次都会丢失生产数据。这是行不通的。这就是为什么我们使用迁移来对现有数据库进行所需的更改。
所以。项目越深入,随着对数据库的更改越多,您将获得越多的迁移。随着每次迁移,这些迁移越来越成为生产中内容的真实来源-重要的不是模式中的内容,而是在生产环境中运行了哪些迁移。如果我们使两者同步,则差异实际上是没有意义的。但是一旦一个从另一个过时,理想情况下,这种情况不会发生,但我们生活在真实的世界中,事情会发生。如果您使用schema:load在本地设置数据库,您可能无法获得数据库的实际状态,因为它通过生产上的迁移历史反映出来。

3npbholx

3npbholx9#

rake db:schema:load用于从schema.rb文件创建数据库模式。schema.rb文件是Ruby代码中数据库模式的表示。此命令通常在设置新数据库或需要重新启动时使用。
另一方面,rake db:migrate用于将新数据库迁移应用到现有数据库。数据库迁移用于随着时间的推移对数据库架构进行更改。这些更改可以包括创建新表、修改现有表或向现有表添加新列。

相关问题