【问题标题】:Rake db:migration against an existing DBRake db:针对现有数据库的迁移
【发布时间】:2014-04-17 13:55:57
【问题描述】:

我有一个新的 rails 应用程序,它将使用现有数据库(由另一个 ruby​​ 应用程序创建)。 为此,我为已经存在的数据库表创建了一个模型,但现在 rails 给了我必须运行的错误消息

rake db:migration

但是如果我尝试这样做,我会收到一个错误,因为该表已经存在。

有没有办法执行迁移并忽略现有表?该表是正确的,应该在那里并且填充了来自另一个应用程序的数据。我想让这个应用程序使用这些信息。

谢谢

编辑: 数据库设置很好,因为我之前能够执行 db:migrations。我使用

创建了模型
rails g model fundo

(fundo是模型名,fundoS是表名) 模型还没有属性,但是表有列

编辑 2: 如果我使用 --trace 运行,这些是输出

$ rake db:schema:dump --trace

** 调用 db:schema:dump (first_time)

** 调用环境(first_time)

** 执行环境

** 调用 db:load_config (first_time)

** 执行 db:load_config ** 执行 db:schema:dump

$ rake db:migrate --trace

** 调用 db:migrate (first_time)

** 调用环境(first_time)

** 执行环境

** 调用 db:load_config (first_time)

** 执行 db:load_config

** 执行 db:migrate == CreateFundos:迁移 ============================================== ======

-- create_table(:fundos) rake 中止!发生错误,此迁移和所有后续迁移已取消:PG::DuplicateTable: ERROR: relationship "fundos" 已经存在 CREATE TABLE "fundos" ("id" serial primary 键,“created_at”时间戳,“updated_at”时间戳)

似乎 rails 正在尝试重新创建表。但我只是想让它们同步,因为表已经在那里了!

【问题讨论】:

  • 您能否确认您的数据库配置正确,并且您现有的表命名符合新创建模型的 Rails 标准?
  • @vee 更新了问题;)

标签: ruby-on-rails rake


【解决方案1】:

如果您使用rails g model 为现有表创建模型,只需删除创建的迁移文件即可。

表架构将在 schema.rb 中正确转储,因此即使没有迁移文件,也始终可以在具有 rake db:setup 的其他计算机上从头开始创建。

您可以使用rake db:schema:dump 手动更新schema.rb。

【讨论】:

    【解决方案2】:

    是否有很多要执行的迁移文件?如果不是太多,您可以执行特定版本的迁移

    rake db:migrate:redo VERSION=version
    

    如果创建表的迁移文件不是太多,也许您可​​以通过添加来编辑迁移文件:

     if ActiveRecord::Base.connection.table_exists?(table_name)
    

    在创建表之前。

    在您的本地环境中,也许您可​​以删除不必要的文件。

    【讨论】:

      【解决方案3】:

      cd db/迁移/

      ls |切-d '_' f1 |而读线; do bundle exec rake db:migrate:up VERSION=$line;完成

      在文件中运行所有迁移

      【讨论】:

        【解决方案4】:

        -- create_table(:fundos) rake 中止!发生了一个错误,这个和所有以后的>迁移被取消:PG::DuplicateTable: 错误:关系“fundos”已经存在>CREATE TABLE“fundos”(“id”序列主键,“created_at”时间戳,>“updated_at”时间戳)

        我要做的是转到 db/migrate 并转到发生 create_table(:fundos) 的迁移文件。注释掉那一行。再试一次,如果再次抛出错误,检查错误并找到有问题的代码。然后将其注释掉并继续这样做直到它通过。一旦通过,取消注释所有内容。

        【讨论】:

          猜你喜欢
          • 2012-09-18
          • 2013-02-01
          • 2012-11-17
          • 1970-01-01
          • 1970-01-01
          • 2012-02-24
          • 1970-01-01
          相关资源
          最近更新 更多