关于ruby on rails:Rake db:针对现有数据库的迁移

Rake db:migration against an existing DB

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

1
rake db:migration

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

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

谢谢

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

1
rails g model fundo

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

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

$ rake db:schema:dump --trace

** Invoke db:schema:dump (first_time)

** Invoke environment (first_time)

** Execute environment

** Invoke db:load_config (first_time)

** Execute db:load_config
** Execute db:schema:dump

$ rake db:migrate --trace

** Invoke db:migrate (first_time)

** Invoke environment (first_time)

** Execute environment

** Invoke db:load_config (first_time)

** Execute db:load_config

** Execute db:migrate
== CreateFundos: migrating ===================================================

-- create_table(:fundos) rake aborted! An error has occurred, this and all later migrations canceled: PG::DuplicateTable: ERROR: relation
"fundos" already exists CREATE TABLE"fundos" ("id" serial primary
key,"created_at" timestamp,"updated_at" timestamp)

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


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

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

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


cd db / migrate /

ls |切-d'_'f1 |读线;捆绑exec rake db:migrate:up VERSION = $ line; DONE

运行文件中的所有迁移


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

1
rake db:migrate:redo VERSION=version

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

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

在创建表之前。

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


-- create_table(:fundos) rake aborted! An error has occurred, this and all later >migrations canceled: PG::DuplicateTable: ERROR: relation"fundos" already exists >CREATE TABLE"fundos" ("id" serial primary key,"created_at" timestamp, >"updated_at" timestamp)

我要做的是转到db / migrate并转到create_table(:fundos)发生的迁移文件。排队的评论。再试一次,如果再次抛出错误,请检查错误并找到有问题的代码。然后评论出来并继续这样做直到它通过。一旦它通过,取消评论一切。