【问题标题】:Heroku: Migration issues when pulling production database to testing and running rake db:migrateHeroku:将生产数据库拉到测试和运行 rake db:migrate 时的迁移问题
【发布时间】:2011-10-29 04:42:51
【问题描述】:

我在 heroku 上有 3 个我的 rails 应用程序实例(测试、阶段和生产)。当我想测试真实用户数据发生的问题时,我想先进行 heroku db:pull --app 生产,然后再进行 heroku db:push --app 测试。问题是此时 heroku rake db:migrate --app test 会抛出错误,因为迁移尝试创建的列已经创建。

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

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

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

【问题讨论】:

    标签: activerecord heroku


    【解决方案1】:

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

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

    【讨论】:

    • 看起来 heroku db:pull 只是将新数据粘贴到我现有的模式中,所以当发生这种情况时,在本地运行 rake db:migrate 会产生以下错误。当我查看数据库时,我发现它落后于迁移,并且具有在尚未运行的迁移中创建的表。有没有办法将整个数据库拉到本地,包括架构并覆盖我在本地的所有内容? SQLite3::SQLException: 表“user_roles”已经存在
    • 是的,pull 会这样做。如果您已经在本地运行迁移说创建表,那么从实时提取不会首先删除您的本地数据库 - 所以您的 user_roles 表将已经在本地存在,但您的 schema_migrations 表不会认为它已运行,所以让您在拉后运行 -然后砰,错误。您想确保您的本地数据库在拉之前通过 db:reset 完全为空。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2017-08-27
    • 2014-02-13
    • 1970-01-01
    • 2017-01-07
    • 2021-10-16
    • 2012-06-05
    • 2011-10-19
    相关资源
    最近更新 更多