截断schema_migrations表是否安全?

时间:2015-04-08 12:16:14

标签: ruby-on-rails database postgresql database-migration

TL; DR

如果我错过了一些迁移文件,并且我想重新创建数据库,是否可以转储架构/结构并删除schema_migrations表的所有行,这样我就不会有待处理迁移错误?

长版

我将使用的一些术语:

  • 默认数据库 - 默认情况下Rails期望/创建的数据库,它的名称格式为 appname_development / appname_test 等,具体取决于关于环境。
  • 主数据库 - 在多数据库环境中 - 数据库,其中存储了大多数但不是所有模型。该数据库的所有模型在其声明中都有establish_connection行。

警告:我将描述一个有很多违反Rails最佳做法的应用,其中大部分内容我都不知道原因。我的目标是让事情回到正轨。

我最近接手了一个使用多个数据库的应用程序的开发。主数据库(不是 appname_development )通过以下方式进行操作 - 有一个单独的Rails应用程序,仅用于通过迁移操作数据库。因此,例如,如果您想添加模型,则转到另一个应用程序,创建迁移,运行它,在主应用程序中,您只需使用代码创建模型文件。在主应用程序中有一些迁移,因为还有一些模型存储在默认数据库中( appname_development )。最重要的是,一些开发人员直接通过psql更改了数据库。

我想将主数据库设为默认数据库,因此我更改了database.yml,以便development指向主数据库,并从模型中删除了establish_connection行。此外,我转而使用structure.sql而不是schema.rb,因为数据库有很多存储过程。

但是,我遇到的问题是,schema_migrations表包含很多行,我没有相应的迁移,应用报告有pending migrations。我有很多条目,我没有相应的文件:

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20131007211329  ********** NO FILE **********
   up     20131007211336  ********** NO FILE **********
   up     20131007211343  ********** NO FILE **********
   up     20131007211349  ********** NO FILE **********
   up     20131007211355  ********** NO FILE **********
   up     20131007211402  ********** NO FILE **********
   up     20131007211409  ********** NO FILE **********
   up     20131007211415  ********** NO FILE **********
   up     20131007211422  ********** NO FILE **********
   up     20131007211428  ********** NO FILE **********
   up     20131007211436  ********** NO FILE **********

现在,我的问题是 - 没关系,如果我只是删除这些行并且"开始清理"。另外,如果我运行rails g migration,是否会生成正常迁移,是否会创建schema_migrations表中的相应行?

最后一点想法 - 对我来说,目前不能通过rake db:reset简单地重新创建数据库,因为有大约5GB的数据。我现在通常应该使用seeds.rb文件,但是现在我没有时间深入了解项目的细节并生成种子数据,但必须使用生产数据。我的想法如下:

  • 截断schema_migrations表格,以便我没有待处理的迁移错误;
  • 仅从主数据库导出数据;
  • 删除数据库;
  • rake db:create
  • rake db:structure:load以便我拥有db结构,自定义类型和存储过程;
  • 将数据转储导入新数据库;
  • 通过正常的Rails迁移对db进行任何未来的更改,以便尽可能少地下载到psql;

提前感谢您提供相关信息,我愿意提供任何其他信息。

0 个答案:

没有答案