簡體   English   中英

Rake:db遷移失敗,並帶有預先存在的mySQL數據庫

[英]Rake:db migrate failing with pre-existing mySQL database

我正在嘗試使用預先存在的mySQL數據庫創建Rails實例,並且正在遵循本指南

第1-3步有效,但是在運行Rails服務器時,它說有遷移掛起。

如果有人能告訴我錯誤的出處或對如何將現有的mySQL數據庫與Rails應用程序集成提供一般性指示,我將不勝感激。

運行rake db:migrate會產生此錯誤

== 1 CreateDatabase: migrating ================================================
-- create_table("Bill", {:primary_key=>"confirmationNo", :id=>:integer, :force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=latin1"})
   -> 0.0556s
-- create_table("Customer", {:primary_key=>"creditCardNo", :id=>:integer, :force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=latin1"})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails: DROP TABLE `Customer` CASCADE

這是我的schema.rb和migration / 001_create_database.rb

schema.rb

ActiveRecord::Schema.define(version: 0) do

  create_table "Bill", primary_key: "confirmationNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "pointsEarned",            null: false
t.float   "amountDue",    limit: 24, null: false
  end

  create_table "Customer", primary_key: "creditCardNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "guestID",             null: false
t.string  "username", limit: 30
t.string  "name",     limit: 30, null: false
t.index ["guestID", "username"], name: "guestID", unique: true, using: :btree
t.index ["username"], name: "username", using: :btree
  end

  create_table "Manager", primary_key: "managerID", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.string "name", limit: 10, null: false
  end

  create_table "Reservation", primary_key: "confirmationNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.date    "inDate"
t.date    "outDate"
t.boolean "availability", null: false
t.integer "roomNo"
t.integer "creditCardNo"
t.index ["creditCardNo"], name: "creditCardNo", using: :btree
t.index ["inDate", "outDate"], name: "inDate", using: :btree
t.index ["roomNo"], name: "roomNo", using: :btree
  end

  create_table "Room", primary_key: "roomNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.string "roomType", limit: 30, null: false
t.index ["roomType"], name: "roomType", using: :btree
  end

  create_table "Roomtype", primary_key: "roomType", id: :string, limit: 30, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "capacity",            null: false
t.float   "rate",     limit: 24, null: false
  end

  create_table "Stay", primary_key: ["inDate", "outDate"], force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.date "inDate",  null: false
t.date "outDate", null: false
  end

  create_table "User", primary_key: "username", id: :string, limit: 1, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "points", null: false
  end

  add_foreign_key "Bill", "Reservation", column: "confirmationNo", primary_key: "confirmationNo", name: "Bill_ibfk_1"
  add_foreign_key "Customer", "User", column: "username", primary_key: "username", name: "Customer_ibfk_1"
  add_foreign_key "Reservation", "Customer", column: "creditCardNo", primary_key: "creditCardNo", name: "Reservation_ibfk_3"
  add_foreign_key "Reservation", "Room", column: "roomNo", primary_key: "roomNo", name: "Reservation_ibfk_1"
  add_foreign_key "Reservation", "Stay", column: "inDate", primary_key: "inDate", name: "Reservation_ibfk_2", on_delete: :cascade
  add_foreign_key "Reservation", "Stay", column: "outDate", primary_key: "outDate", name: "Reservation_ibfk_2", on_delete: :cascade
  add_foreign_key "Room", "Roomtype", column: "roomType", primary_key: "roomType", name: "Room_ibfk_1"
end

遷移/ 001_create_database.rb

class CreateDatabase < ActiveRecord::Migration
  def self.up

ActiveRecord::Schema.define(version: 0) do

  create_table "Bill", primary_key: "confirmationNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "pointsEarned",            null: false
t.float   "amountDue",    limit: 24, null: false
  end

  create_table "Customer", primary_key: "creditCardNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "guestID",             null: false
t.string  "username", limit: 30
t.string  "name",     limit: 30, null: false
t.index ["guestID", "username"], name: "guestID", unique: true, using: :btree
t.index ["username"], name: "username", using: :btree
  end

  create_table "Manager", primary_key: "managerID", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.string "name", limit: 10, null: false
  end

  create_table "Reservation", primary_key: "confirmationNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.date    "inDate"
t.date    "outDate"
t.boolean "availability", null: false
t.integer "roomNo"
t.integer "creditCardNo"
t.index ["creditCardNo"], name: "creditCardNo", using: :btree
t.index ["inDate", "outDate"], name: "inDate", using: :btree
t.index ["roomNo"], name: "roomNo", using: :btree
  end

  create_table "Room", primary_key: "roomNo", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.string "roomType", limit: 30, null: false
t.index ["roomType"], name: "roomType", using: :btree
  end

  create_table "Roomtype", primary_key: "roomType", id: :string, limit: 30, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "capacity",            null: false
t.float   "rate",     limit: 24, null: false
  end

  create_table "Stay", primary_key: ["inDate", "outDate"], force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.date "inDate",  null: false
t.date "outDate", null: false
  end

  create_table "User", primary_key: "username", id: :string, limit: 1, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t|
t.integer "points", null: false
  end

  add_foreign_key "Bill", "Reservation", column: "confirmationNo", primary_key: "confirmationNo", name: "Bill_ibfk_1"
  add_foreign_key "Customer", "User", column: "username", primary_key: "username", name: "Customer_ibfk_1"
  add_foreign_key "Reservation", "Customer", column: "creditCardNo", primary_key: "creditCardNo", name: "Reservation_ibfk_3"
  add_foreign_key "Reservation", "Room", column: "roomNo", primary_key: "roomNo", name: "Reservation_ibfk_1"
  add_foreign_key "Reservation", "Stay", column: "inDate", primary_key: "inDate", name: "Reservation_ibfk_2", on_delete: :cascade
  add_foreign_key "Reservation", "Stay", column: "outDate", primary_key: "outDate", name: "Reservation_ibfk_2", on_delete: :cascade
  add_foreign_key "Room", "Roomtype", column: "roomType", primary_key: "roomType", name: "Room_ibfk_1"
end

  end

  def self.down
# drop all the tables if you really need
# to support migration back to version 0
  end
end

干杯

您的MySQL數據庫是否有“ schema_migrations”表? Rails依靠此表根據數據庫和schema.rb文件中的版本號來確定是否有任何待處理的遷移。 更新您的schema.rb文件,使其版本為標准格式:“ 20170326120700”而不是“ 0”,然后創建一個名為“ version”的表“ schema_migrations”,並將版本號“ 20170326120700”插入新表。 Rails應該停止抱怨即將進行的遷移。 “版本”字段應為VARCHAR(255)類型。

要使schema.rb與數據庫再次同步,可以按照重新創建schema.rb的過程進行操作,就像在教程“ rake db:schema:dump”中找到的那樣。 在schema.rb文件和“ schema_migrations”表中驗證您的版本是否仍然匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM