Heroku:将生产数据库拉到测试并运行rake db:migrate时的迁移​​问题

use*_*065 1 activerecord heroku

我在heroku上有3个我的rails应用程序实例(测试,舞台和制作).当我想测试真实用户数据发生的问题时,我想使用heroku db:pull --app production,然后是heroku db:push --app test.问题是,此时heroku rake db:migrate --app test会抛出一个错误,因为已经创建了迁移尝试创建的列.

我的理解是heroku db:push将数据推送到现有的数据库模式,而不是逐字推送整个数据库(包括模式).这意味着我们推送的模式可能比我们推送的迁移表更高级,因为此迁移表将丢失尚未在我们从中提取的数据库上运行的迁移记录,但显然已在我们推送到的数据库上运行.

我的第一个问题是,我是否理解这是如何工作的?我的第二个问题是如何解决这个问题,以便我可以提取生产数据,坚持测试并运行迁移而不会收到此错误.理想情况下,我想复制生产数据库并将其粘贴在测试中,然后完全迁移它,因为如果我能做到这一点,我就不必担心测试中的现有模式.有没有办法做到这一点?

如果没有,是否有办法通过使用已在我的测试数据库上运行的每个迁移的记录填充新的迁移表来伪造已经运行的迁移?

Joh*_*non 5

不,db:push推送本地架构和数据.您可以将本地数据库推送到Heorku上的空数据库,这就是我将网站设置为实时的方式 - 当您运行它时,您会看到它创建模式然后推送数据.

我这样工作 - 在Heroku上的测试环境与现场相同的代码 - 即.主人的一个分支(即什么是生活和推动测试).从Live中拉出DB.修复我的本地系统.推送测试并运行迁移.Heroku上针对DB的测试版本.当我很高兴将测试代码合并到master中,然后部署并运行迁移.冲洗并重复以备将来的错误.生产数据库永远不应该有更高级的架构版本进行测试.您可以通过查看schema_migrations表来检查这一点 - 这就是Rails如何知道到目前为止已运行的迁移的方式,因此您可以将其与db/migrations文件进行比较.

  • 是的,拉会做到这一点.如果您在本地运行称为创建表的迁移,那么从实时中提取将不会首先删除本地数据库 - 因此您的user_roles表已经存在于本地,但您的schema_migrations表将不会认为它已运行所以让您在拉动之后运行 - 然后bam,错误.你需要在拉动之前通过db:reset确保你的本地数据库是完全空的rake. (3认同)