【问题标题】:Heroku run rake db:migrate creates different db than schema.rbHeroku run rake db:migrate 创建与 schema.rb 不同的数据库
【发布时间】:2015-03-17 23:12:19
【问题描述】:

我正在尝试将我的应用程序迁移到 MySQL 数据库 ClearDb 上的 Heroku。在运行 heroku rake db:migrate 时,MySQL 工作台中的结果与 schema.rb 完全不匹配,因此在尝试启动和查看已部署的应用程序时会产生问题。

是否可以“重置”heroku 迁移命令,使其真正匹配应用程序schema.rb 文件?

运行heroku rake db:migrate的结果:

schema.rb 文件:

ActiveRecord::Schema.define(version: 2****************) do

  create_table "business_users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "password_digest"
    t.string   "remember_token"
    t.boolean  "admin",           default: false, null: false
    t.string   "phoneNum"
    t.integer  "zipCode"
    t.string   "address"
    t.string   "city"
    t.string   "country"
    t.string   "state"
    t.string   "website"
    t.string   "addinfo"
    t.integer  "removed",         default: 0,     null: false
  end

  add_index "business_users", ["city"], name: "index_business_users_on_city", using: :btree
  add_index "business_users", ["email"], name: "index_business_users_on_email", unique: true, using: :btree
  add_index "business_users", ["remember_token"], name: "index_business_users_on_remember_token", using: :btree
  add_index "business_users", ["state"], name: "index_business_users_on_state", using: :btree
  add_index "business_users", ["zipCode"], name: "index_business_users_on_zipCode", using: :btree

  create_table "campaign_categories", force: true do |t|
    t.integer  "campaign_id"
    t.integer  "category_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "campaign_category_metro_bids", force: true do |t|
    t.integer  "campaign_id"
    t.integer  "category_id"
    t.integer  "metro_id"
    t.float    "average_bid_price"
    t.float    "average_placement"
    t.integer  "number_times_user_pulled"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.float    "set_max_bid"
  end

  add_index "campaign_category_metro_bids", ["average_bid_price"], name: "index_campaign_category_metro_bids_on_average_bid_price", using: :btree
  add_index "campaign_category_metro_bids", ["campaign_id"], name: "index_campaign_category_metro_bids_on_campaign_id", using: :btree
  add_index "campaign_category_metro_bids", ["set_max_bid"], name: "index_campaign_category_metro_bids_on_set_max_bid", using: :btree

  create_table "campaign_locations", force: true do |t|
    t.integer  "campaign_id", null: false
    t.integer  "location_id", null: false
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

  create_table "campaign_metros", force: true do |t|
    t.integer  "campaign_id"
    t.integer  "metro_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "campaign_metros", ["campaign_id"], name: "index_campaign_metros_on_campaign_id", using: :btree
  add_index "campaign_metros", ["metro_id"], name: "index_campaign_metros_on_metro_id", using: :btree

  create_table "campaigns", force: true do |t|
    t.integer  "restaurant_id"
    t.string   "name"
    t.float    "bid_price"
    t.float    "budget"
    t.string   "ad_caption"
    t.string   "ad_details"
    t.boolean  "mobile_order",          default: false
    t.boolean  "call_order",            default: false
    t.string   "mobile_site",           default: "0"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "image"
    t.string   "ad_details_fine_print"
    t.boolean  "monday",                default: false
    t.boolean  "tuesday",               default: false
    t.boolean  "wednesday",             default: false
    t.boolean  "thursday",              default: false
    t.boolean  "friday",                default: false
    t.boolean  "saturday",              default: false
    t.boolean  "sunday",                default: false
    t.boolean  "breakfast",             default: false
    t.boolean  "lunch",                 default: false
    t.boolean  "dinner",                default: false
    t.integer  "texts",                 default: 0
    t.integer  "clicks",                default: 0
    t.string   "start_dt"
    t.string   "end_dt"
    t.integer  "get_there",             default: 0
    t.integer  "restaurant_favorited",  default: 0
    t.integer  "user_saves",            default: 0
    t.boolean  "is_active",             default: false
    t.boolean  "removed",               default: false, null: false
  end

  add_index "campaigns", ["restaurant_id"], name: "index_campaigns_on_user_id", using: :btree

  create_table "categories", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "active",     default: true, null: false
  end

  create_table "cities", force: true do |t|
    t.string   "city"
    t.string   "state"
    t.integer  "state_id"
    t.string   "city_whole"
    t.float    "latitude"
    t.float    "longitude"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "active",     default: 1, null: false
  end

  create_table "locations", force: true do |t|
    t.integer  "store_number"
    t.string   "address"
    t.string   "state"
    t.integer  "zip"
    t.string   "sit_down"
    t.string   "drive_through"
    t.float    "latitude"
    t.float    "longitude"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "city_name"
    t.integer  "restaurant_id"
    t.integer  "city_id"
    t.integer  "user_set_active", default: 1,     null: false
    t.boolean  "removed",         default: false, null: false
  end

  add_index "locations", ["city_name"], name: "index_locations_on_city", using: :btree
  add_index "locations", ["latitude"], name: "index_locations_on_latitude", using: :btree
  add_index "locations", ["longitude"], name: "index_locations_on_longitude", using: :btree
  add_index "locations", ["restaurant_id"], name: "index_locations_on_user_id", using: :btree
  add_index "locations", ["state"], name: "index_locations_on_state", using: :btree
  add_index "locations", ["store_number"], name: "index_locations_on_store_number", using: :btree

  create_table "metros", force: true do |t|
    t.string   "city"
    t.string   "state"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.float    "latitude"
    t.float    "longitude"
  end

  add_index "metros", ["latitude"], name: "index_metros_on_latitude", using: :btree
  add_index "metros", ["longitude"], name: "index_metros_on_longitude", using: :btree

  create_table "restaurant_menus", force: true do |t|
    t.integer  "restaurant_id"
    t.string   "item_name"
    t.string   "description"
    t.string   "iamge"
    t.integer  "calories"
    t.float    "price"
    t.integer  "period"
    t.integer  "type"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "restaurants", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.integer  "business_user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "removed",          default: false, null: false
  end

  create_table "states", force: true do |t|
    t.string   "state"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

【问题讨论】:

    标签: ruby-on-rails heroku rake database-schema


    【解决方案1】:

    如果架构比迁移更好,您可以改用rake db:schema:load。但是TBH我会弄清楚为什么两者会分道扬镳……这听起来有点危险。

    【讨论】:

    • 我最初使用迁移,然后使用 PHPMyAdmin 将我的应用程序移至 MySQL,并使用 PHPMyAdmin 而不是迁移。因此它们不同步。是否有明确的方法来“同步”它们?
    • 添加缺少的迁移(包括您在 PHPMyAdmin 中手动执行的任何操作)...同样适用于 Rails 站点 - 您不应该在不通过迁移的情况下执行任何更改数据库的操作...或否则你最终会处于这种状态;)
    • 我有schema.rb,我可以创建一个新应用程序,将所有其他文件保存到该新应用程序,然后使用所有 schema.rb 内容运行大迁移以恢复同步?
    • 我不建议这样做 - 因为这是错误的架构。迁移应该始终正确,并让您获得应用程序的工作版本。我会查看本地架构与新应用程序架构之间的差异 - 并且只需创建使更改匹配的迁移,
    • 我可以从存在中删除特定的迁移吗?例如,运行 heroku run rake db:migrate 会在终端中显示条目:Migrating to CreateActiveCampaignDows (20131211034850) == CreateActiveCampaignDows: migrating ======================================= -- create_table(:active_campaign_dows) -> 0.0018s == CreateActiveCampaignDows: migrated (0.0019s) ============================== 当我从未使用显示的操作显式创建迁移时
    【解决方案2】:

    删除所有迁移文件。然后使用当前数据库结构的转储准备一次大迁移 - 您可以使用execute 方法来执行此操作。接下来运行您的测试并检查应用程序是否正在使用从此迁移创建的数据库。如果一切正常,请在没有 schema_migrations 表的情况下复制您的数据。覆盖此表会再次破坏您的迁移。

    这是最简单的解决方案(如果您进行了很多更改),但最好添加缺少的迁移并仅使用数据导入转储,而不使用数据库结构。

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2014-07-10
      • 2015-02-20
      • 2014-03-21
      • 2020-01-26
      • 2017-01-07
      • 1970-01-01
      • 2015-05-29
      相关资源
      最近更新 更多