ruby-on-rails - 结构转储和结构加载
问题描述
我不明白我们什么时候会使用structure_dump
and structure_load
。Rails 文档中没有信息:
ActiveRecord::Tasks::DatabaseTasks::structure_load
ActiveRecord::Tasks::DatabaseTasks::structure_dump
有人可以彻底解释这些方法吗?
解决方案
首先,我将链接到一些可能更有帮助的 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:dump
不db:structure:load
推荐使用。在 6.1 及更高版本中,模式类型可在您的环境配置中进行配置:
config.active_record.schema_format = :sql
这将切换正常db:schema:load
并db:schema:dump
改为使用 SQL 格式。
TLDR:有时 ActiveRecord 很难将模式直接转储到 Ruby 代码,因此structure_dump
允许转储到原始 SQL。可以运行该 SQL 以重新创建数据库模式,就像schema.rb
运行 a 以重新创建数据库模式一样。您可以将其作为原始 SQL 或通过运行 rake 任务加载到数据库中db:structure:load
。在 Rails 6.1 中,这正在发生变化。
推荐阅读
- node.js - NodeJS:SOAP API 调用,无需在每个 SOAP 方法调用之前创建肥皂客户端
- javascript - 如何处理带有特殊字符的数据目标值?
- excel - 循环遍历范围以创建嵌套数据树
- python - 您必须为占位符张量提供一个值
- performance - 如何在存储过程中替换游标以在 MS SQL 中更快地执行?
- angular - 如何在本地主机上使用 PathLocationStrategy?
- python - 根据熊猫数据框中字符串列表的另一列获取列值
- eiffel - 无法创建 EWF 应用程序
- wordpress - 如何在 WordPress 中获取自定义分类法的所有父/子类别
- nginx - Nginx try_files 不起作用 404,无法加载文件