Rails:schema.rb有什么用?


72

我曾经以为db/schema.rbRails项目中存储了数据库架构,以便ActiveRecord可以知道它具有什么表/列。

但是更早之前,我惊讶地注意到,删除后我的项目可以正常运行db/schema.rb

那么,既然Rails没有它就可以工作,那么schema.rb真正的作用是什么?

Answers:


108

schema.rb主要有两个目的:

  1. 它记录了数据库模式的最终当前状态。通常,尤其是当您有多个迁移时,仅从迁移中就很难推断出模式。有了礼物schema.rb,您可以在那里看看。ActiveRecord本身确实不会使用它。它将在运行时内省数据库,因为这比期望用户保持schema.rb最新状态要安全得多。但是,为避免使开发人员感到困惑,您应始终维护一个与迁移有关的最新文件。

  2. 测试使用它来填充数据库模式。因此,rake db:schema:dump通常将其作为耙test:prepare运行的一部分。目的是测试数据库的架构与当前开发数据库完全匹配。


2
我认为应该期望用户保持schema.rb最新状态,因为同一文件上的注释说明了这一点请注意,此schema.rb定义是数据库架构的权威来源
jgomo3 '16

jgomo3-该文件中的相同注释也显示“此文件是自动生成的...”。因此,用户无需保持此文件为最新。它在迁移过程中自动发生。

1
在某些情况下,您确实需要更新数据库架构。例如,在我们的案例中,我们有多个共享大多数模型的Rails应用程序,并且这些模型被放置在shared-models每个应用程序都依赖的单独的仓库中(简称为)。我们将迁移放入shared-models,但在其中一个应用(例如app1)中运行它。然后,schema.rb在迁移期间for app1会自动更新,但schema.rb其他应用程序的文件不会更新。您仍然需要将更新的schema.rb文件从app1复制到其他应用程序,以便它们都是最新的
明智的

4

Rails文档/ 6.1模式文件有哪些用途?

迁移(尽管可能如此)并非数据库架构的权威来源。该角色属于db / schema.rb或Active Record通过检查数据库生成的SQL文件。它们不是为了进行编辑而设计的,它们仅表示数据库的当前状态。

无需(并且容易出错)通过重播整个迁移历史记录来部署应用程序的新实例。只需将当前模式的描述加载到数据库中,将更加简单快捷。

例如,这就是创建测试数据库的方式:将当前的开发数据库转储(到db / schema.rb或db / structure.sql),然后加载到测试数据库中。

如果要快速查看Active Record对象具有哪些属性,则架构文件也很有用。此信息不在模型的代码中,并且经常分散在多个迁移中,但是可以在模式文件中很好地汇总这些信息。如果需要,annotate_models gem会在每个模型的顶部自动添加和更新注释,以汇总架构。

涵盖了Rails文档。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.