【问题标题】:Rails need to migrate everytime restart serverRails 每次重启服务器都需要迁移
【发布时间】:2019-06-25 17:21:52
【问题描述】:

将我的应用程序部署到 heroku 时,我收到一些关于迁移的错误。

所以我合并了所有的迁移,只需持有包含所有 finally 属性的创建表文件,删除编辑表。

现在,每次重启服务器(本地主机),我都必须再次db:migrate 才能正常工作。

当我只使用db:migrate 时,错误提示:table 'product' already existed' 所以我必须先db:drop,然后db:migrate才能使我的应用程序正常工作 我花了很多时间。 我该如何解决这个问题? 这是我的迁移状态:

up 20190306060445 ********** NO FILE ********** down 20190306060545 Create product up 20190307035103 Create active storage tablesactive storage up 20190308045037 ********** NO FILE ********** up 20190308071304 ********** NO FILE ********** down 20190308072304 Devise create users up 20190308074025 Devise create admins down 20190308082018 Create categories up 20190308083018 ********** NO FILE ********** up 20190311041416 ********** NO FILE ********** up 20190313084429 Create payment up 20190314024236 Create cart up 20190314024911 Create cart product up 20190314035334 Create messages up 20190314145333 Create payment item up 20190314151340 ********** NO FILE ********** up 20190315020606 ********** NO FILE ********** up 20190318073652 Create voucher up 20190319035819 ********** NO FILE ********** up 20190319134032 Contacts up 20190320034249 ********** NO FILE ********** up 20190320062223 ********** NO FILE ********** up 20190325132236 ********** NO FILE ********** up 20190325155829 ********** NO FILE ********** up 20190329095529 ********** NO FILE ********** up 20190329110656 ********** NO FILE ********** up 20190330145000 ********** NO FILE ********** up 20190331162926 ********** NO FILE ********** up 20190408155326 ********** NO FILE ********** up 20190419055934 ********** NO FILE ********** up 20190419060341 ********** NO FILE ********** up 20190502105847 ********** NO FILE ********** up 20190502110019 Add stock up 20190506114910 ********** NO FILE ********** up 20190506115146 ********** NO FILE ********** up 20190506115302 ********** NO FILE ********** up 20190513042021 ********** NO FILE ********** up 20190513050115 ********** NO FILE ********** up 20190514025220 ********** NO FILE ********** up 20190514031046 ********** NO FILE ********** up 20190516010239 Create comment up 20190516020021 ********** NO FILE ********** up 20190517132706 Create notification up 20190524152143 Create brands up 20190527040142 ********** NO FILE ********** up 20190528113143 Add columns devise up 20190528113658 Add columns devise 1 up 20190531125307 Create news up 20190531144908 Create ckeditor assets up 20190601100118 Create news products up 20190602144319 Create type of news up 20190602155208 ********** NO FILE ********** up 20190603062824 ********** NO FILE ********** up 20190606172629 ********** NO FILE ********** up 20190607074100 ********** NO FILE ********** up 20190607122350 ********** NO FILE ********** up 20190607140214 ********** NO FILE ********** up 20190608082804 ********** NO FILE ********** up 20190609051100 Add omniauth to users up 20190611115405 ********** NO FILE ********** up 20190612071933 Create table carousels up 20190612100433 ********** NO FILE ********** up 20190613082404 ********** NO FILE ********** up 20190614131413 ********** NO FILE ********** up 20190615161828 ********** NO FILE ********** up 20190617154212 Create district up 20190617154602 Create province up 20190619140034 Create ward up 20190620134528 ********** NO FILE ********** down 20190620140214 Convert tables to utf8 v1 up 20190622123753 ********** NO FILE **********

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5


    【解决方案1】:

    在更改所有迁移时,您创建了“新”迁移。 rails db:migrate 正在尝试将这些“新”迁移应用到已经存在的数据库。 (应用迁移的列表保存在schema_migrations 表中)。我们可以看到所有down 迁移都是尚未应用的迁移。包括down 20190306060545 Create product

    由于这是一个正在运行的生产数据库,因此product 表可能已经存在。当 Rails 运行迁移 20190306060545 Create product 可能会尝试迁移到 create_table :product 时,它将失败,因为 product 已经存在。

    避免这种情况的一种方法是首先检查表是否存在于您的“创建表”迁移中。如果是,什么也不做。

    if table_exists?(:product)
      return
    end
    

    在开发中重现这个...

    • 查看原始迁移。
    • 从中创建一个新模式:rails db:migrate:reset
    • 查看您的新组合迁移。
    • 尝试迁移:rails db:migrate

    【讨论】:

    • 我是 RoR 新手。据我所知,rails 在更改迁移时需要运行rails db:migrate。但是我什么也没做,为什么每次重新启动服务器时,它都会一次又一次地要求我进行 db:migrate。为什么不仅是产品,我还组合了另一个表(凭证、付款、购物车……),但只有产品展示 down
    • 我刚刚意识到,当运行rails db:migrate:resetschema_migrations 表只显示upmigrations 存在于db/migrate。只有当我将转储数据库文件导入数据库时​​,它才会显示我上面发布的所有内容
    • @Geogre Rails needs to migrate any time it sees migrations which have not been applied (aka pending)。由于您重写了一些迁移,Rails 认为它​​们尚未应用并希望应用它们。 rails db:migrate:reset “工作”,因为它完全摧毁了您的数据库并在一个新的空数据库上重新运行 all 迁移。您显然不想对您的生产数据库这样做。迁移的重点是在不丢失数据的情况下更改数据库。
    • 非常感谢,您帮我了解更多有关 Rails 的信息 ^^ 我按照您的教程,创建新的 schema_migrations,删除 mysqldump 文件中 schema_migration 中的所有 down 迁移,然后使用 table_exist签入迁移文件,一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2021-07-19
    • 1970-01-01
    • 2012-04-24
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多