2011-08-17 39 views
1

我在Heroku(测试,阶段和生产),我的Rails应用程序的3个实例。当我想测试一个真实用户数据发生的问题时,我想要使用heroku db:pull --app生产,然后使用heroku db:push --app测试。问题是,在这一点上,heroku rake db:migrate --app test会抛出一个错误,因为迁移尝试创建的列已经创建。的Heroku:当拉动生产数据库测试和运行耙分贝迁移问题:迁移

我的理解是,Heroku的DB:推推数据导入现有的数据库模式而非字面上推动整个数据库(包括模式)。这意味着我们推动的模式可能比我们推动的迁移表更先进,因为这个迁移表将缺少没有运行在我们从中提取的数据库上的迁移记录,但显然已经运行在我们正在推进的数据库上。

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

如果不是这样,是有办法的假,要迁移已经通过为每一个已经在我的测试数据库运行迁移记录填充新的迁移表运行?

回答

5

没有,DB:推推动本地架构和数据。你可以把你的本地数据库放到Heorku的一个空数据库中,这就是我如何让网站生活 - 当你运行它时,你会看到它创建模式,然后将数据推入。

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

+0

它看起来像Heroku的DB:拉却紧紧新的数据到我的现有模式,虽然这种情况发生运行耙分贝,所以当:迁移对当地产生以下错误。当我查看数据库时,我发现它在迁移方面落后,并且有在尚未运行的迁移中创建的表。有没有办法将整个数据库拉到本地,包括模式,并覆盖我在本地的所有内容? SQLite3 :: SQLException:表“user_roles”已经存在 – user531065

+3

是的,拉会做到这一点。如果你已经在本地运行了表示创建表的迁移,那么从现场拉动并不会首先清除你的本地数据库 - 所以你的user_roles表已经存在于本地,但是你的schema_migrations表不会认为它已经运行了,然后bam,错误。你想确保你的本地数据库完全是通过数据库清空耙:重置之前,你拉。 –

+0

完美。这解决了我的问题。谢谢! – user531065