我不明白我们什么时候会使用structure_dump和structure_load。Rails文档中没有任何信息:
ActiveRecord::Tasks::DatabaseTasks::structure_load
ActiveRecord::Tasks::DatabaseTasks::structure_dump
有人能彻底解释一下这些方法吗?
发布于 2019-07-04 20:41:19
首先,我将链接到一些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及其伴随的rake任务db:structure:dump存在试图解决这个问题。它没有要求ActiveRecord的数据库适配器将其转储到包含schema.rb代码的structure.sql文件中,而是使用数据库的底层管理工具将其转储到包含大量SQL语句的structure.sql文件中。在原始SQL中“表示”数据库模式通常更容易,而不必先将其转换为Ruby代码。生成的structure.sql文件现在可以通过以下两种方式之一重新创建数据库模式/结构:
db/structure.sql的内容。db:structure:load。这将从db/structure.sql读取,并将其内容计算为原始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代码,因此structure_dump允许将模式转储到原始SQL。可以运行该SQL来重新创建数据库架构,就像运行schema.rb来重新创建数据库架构一样。您可以作为原始SQL或通过运行rake任务db:structure:load将其加载到数据库中。在Rails 6.1中,这种情况正在改变。
https://stackoverflow.com/questions/56886120
复制相似问题