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

Activerecord Heroku:将生产数据库拉到测试和运行rake db:migrate时的迁移问题,activerecord,heroku,Activerecord,Heroku,我在heroku测试、舞台和制作中有3个rails应用程序实例。当我想测试真实用户数据中出现的问题时,我想先测试heroku db:pull-app production,然后测试heroku db:push-app。问题是,此时heroku rake db:migrate-app test抛出一个错误,因为迁移尝试创建的列已经创建 我的理解是herokudb:push将数据推送到现有的数据库模式中,而不是直接推送到包含的整个数据库模式中。这意味着我们正在推送的模式可能比我们正在推送的迁移表更高

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

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

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


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

否,db:push推送本地架构和数据。你可以在Heorku上把你的本地数据库推到一个空的数据库中,这就是我把站点放在现场的方式——当你运行它时,你会看到它创建了一个模式,然后把数据推进去


我在Heroku上的测试环境与live-ie的代码相同。master ie的一个分支“what's live and Push to Test”。从现场拉DB。修复我的本地系统。推送测试并运行迁移。针对Heroku上的DB测试发布。当我高兴时,将测试代码合并到主代码中,然后部署并运行迁移。冲洗并重复,以防将来出现错误。生产数据库不应该有更高级的模式版本来进行测试。您可以通过查看schema_migrations表来检查这一点—Rails就是这样知道到目前为止运行了哪些迁移的,因此您可以将其与db/migrations文件进行比较。

否,db:push推送本地架构和数据。你可以在Heorku上把你的本地数据库推到一个空的数据库中,这就是我把站点放在现场的方式——当你运行它时,你会看到它创建了一个模式,然后把数据推进去


我在Heroku上的测试环境与live-ie的代码相同。master ie的一个分支“what's live and Push to Test”。从现场拉DB。修复我的本地系统。推送测试并运行迁移。针对Heroku上的DB测试发布。当我高兴时,将测试代码合并到主代码中,然后部署并运行迁移。冲洗并重复,以防将来出现错误。生产数据库不应该有更高级的模式版本来进行测试。您总是可以通过查看schema_migrations表来检查这一点,这就是Rails如何知道到目前为止运行了哪些迁移,因此您可以将其与db/migrations文件进行比较。

看起来heroku db:pull只是将新数据粘贴到我的现有架构中,但在发生这种情况时,在本地运行rake db:migrate会产生以下错误。当我查看数据库时,我发现它在迁移方面落后了,并且在迁移中创建的表还没有运行。有没有一种方法可以将整个数据库拉到本地(包括模式)并覆盖本地的所有内容?SQLite3::SQLException:表用户角色已经存在,pull将执行此操作。如果您在本地运行了迁移,比如创建表,那么从live中拉取不会首先删除本地数据库-因此您的user_roles表将在本地存在,但schema_migrations表不会认为它已运行,所以让您在拉取后运行-然后bam,错误。在拉取之前,您希望通过DB:reset确保本地数据库完全为空。看起来heroku DB:pull只是将新数据粘贴到我的现有架构中,但在本地运行rake DB:migrate会产生以下错误。当我查看数据库时,我发现它在迁移方面落后了,并且在迁移中创建的表还没有运行。有没有一种方法可以将整个数据库拉到本地(包括模式)并覆盖本地的所有内容?SQLite3::SQLException:表用户角色已经存在,pull将执行此操作。如果您在本地运行了迁移,比如创建表,那么从live中拉取不会首先删除本地数据库-因此您的user_roles表将在本地存在,但schema_migrations表不会认为它已运行,所以让您在拉取后运行-然后bam,错误。在拉取之前,您需要通过DB:reset确保本地DB完全为空。