首页 > 解决方案 > 结构转储和结构加载

问题描述

我不明白我们什么时候会使用structure_dumpand structure_load。Rails 文档中没有信息:

ActiveRecord::Tasks::DatabaseTasks::structure_load

ActiveRecord::Tasks::DatabaseTasks::structure_dump

有人可以彻底解释这些方法吗?

标签: ruby-on-railsrubyactiverecord

解决方案


首先,我将链接到一些可能更有帮助的 Rails 文档。本文档是关于使用您询问的方法的默认 Rails rake 任务:

Rails 模式转储的类型(Rails 边缘指南)

我假设您熟悉 Rails 的db/schema.rb文件。该文件本质上是一个大的“迁移”文件,其中包含一些可以运行的 Ruby 代码,它将在您的数据库中创建所有必要的表和索引。这就是您运行时发生的情况rake db:schema:load

我们可以用来rake db:schema:dump从本质上获取数据库的状态并将其直接转换为schema.rb文件。如果我们没有任何迁移文件并且我们没有现有schema.rb文件,我们可能需要这样做。在某些情况下(不是很多),ActiveRecord 无法正确地将数据库模式直接“转换”为 Ruby 代码。ActiveRecord 无法翻译某些功能/选项,包括但不限于:

structure_dump并且db:structure:dump存在伴随的 rake 任务来尝试解决这个问题。它不是要求 ActiveRecord 的数据库适配器转储到schema.rb包含 Ruby 代码的文件,而是使用数据库的底层管理工具转储到structure.sql包含大量 SQL 语句的文件。在原始 SQL 中“表示”数据库模式通常更容易,而不必先将其转换为 Ruby 代码。生成的structure.sql文件现在可用于通过以下两种方式之一重新创建数据库模式/结构:

  • 在 SQL 提示符下运行 的内容db/structure.sql,或以某种方式由您的数据库管理系统直接评估

  • 运行 rake 任务db:structure:load。这将从原始 SQL 中读取db/structure.sql并评估其内容,但通过 ActiveRecord - 非常类似于db:schema:load.

注意:在 Rails 6.1 中,db:structure:dumpdb:structure:load推荐使用。在 6.1 及更高版本中,模式类型可在您的环境配置中进行配置:

config.active_record.schema_format = :sql

这将切换正常db:schema:loaddb:schema:dump改为使用 SQL 格式。


TLDR:有时 ActiveRecord 很难将模式直接转储到 Ruby 代码,因此structure_dump允许转储到原始 SQL。可以运行该 SQL 以重新创建数据库模式,就像schema.rb运行 a 以重新创建数据库模式一样。您可以将其作为原始 SQL 或通过运行 rake 任务加载到数据库中db:structure:load。在 Rails 6.1 中,这正在发生变化


推荐阅读