代码之家  ›  专栏  ›  技术社区  ›  JSBach

Rake-db:针对现有数据库的迁移

  •  0
  • JSBach  · 技术社区  · 11 年前

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

    rake db:migration
    

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

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

    谢谢

    编辑: DB设置很好,因为我以前能够执行DB:迁移。我使用

    rails g model fundo
    

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

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

    $rake数据库:模式:转储--跟踪

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

    **调用环境(first_time)

    **执行环境

    **调用db:load_config(first_time)

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

    $rake数据库:迁移--跟踪

    **调用数据库:迁移(first_time)

    **调用环境(first_time)

    **执行环境

    **调用db:load_config(first_time)

    **执行db:load_config

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

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

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

    4 回复  |  直到 11 年前
        1
  •  4
  •   Cameron Martin    11 年前

    如果使用 rails g model ,只需删除创建的迁移文件。

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

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

        2
  •  1
  •   lalameat    11 年前

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

    rake db:migrate:redo VERSION=version
    

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

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

    在创建表之前。

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

        3
  •  1
  •   kLn    10 年前

    cd db/迁移/

    ls |读取行时剪切-d“_”f1 |;do bundle exec rake db:migrate:up VERSION=$line;完成

    在文件中运行所有迁移

        4
  •  0
  •   Shaun Sweet    9 年前

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

    我要做的是转到db/migrate并转到create_table(:fundos)所在的迁移文件。注释该行。再试一次,如果它再次抛出错误,请检查错误并查找错误代码。然后把它评论出来,并一直这样做,直到它通过。一旦通过,取消注释所有内容。