2013-09-23 152 views
1

我试着去使用这种迁移,但我不断收到错误,像这些错误迁移DB Rails的

这是我的移民文件

class CreateEmployees < ActiveRecord::Migration 
    def self.up 
    create_table :employees do |t| 
     t.string :name 
     t.date :hiredate 
     t.float :salary 
     t.boolean :fulltime , :default => true 
     t.integer :vacationdays 
     t.text :comments 
    end 
    end 

    def self.down 
    drop_table :employees 
    end 
end 

当我尝试执行耙分贝:迁移得到这个错误:

== CreateEmployees: migrating ================================================ -- create_table(:employees) rake aborted! An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "employees" already exists: CREATE TABLE "employees" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar (255), "hiredate" date, "salary" float, "fulltime" boolean DEFAULT 't', "vacationdays" integer, "comments" text) /Library/Ruby/Gems/2.0.0/gems/sql ite3-1.3.8/lib/sqlite3/database.rb:91:in initialize' /Library/Ruby/Gems/2.0.0/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in new' /Library/Ruby/Gems/2.0.0/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in prepare' /Library/Ruby/Gems/2.0.0/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:134:in execute' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:328:in block in execute' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:425:in block in log' /Library/Ruby/Gems/2.0.0/gems/activesupport-4.0.0/lib/active_support/notifications/instrumenter.rb:20:in instrument' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:420:in log' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:328:in execute' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/schema_statements.rb:190:in create_table' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:625:in block in method_missing' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:597:in block in say_with_time' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:597:in say_with_time' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:617:in method_missing' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:383:in method_missing' /Users/YuriAguirre/Documents/Aptana Studio 3 Workspace/company/db/migrate/20130923140626_create_employees.rb:3:in up' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:534:in up' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:574:in exec_migration' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:555:in block (2 levels) in migrate' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:554:in block in migrate' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:294:in with_connection' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:553:in migrate' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:709:in migrate' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:959:in block in execute_migration_in_transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in block in ddl_transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in block in transactio n' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in within_new_transact ion' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/transactions.rb:209:in transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:1005:in ddl_transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:958:in execute_migration_in_transaction' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:920:in block in migrate' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in each' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:916:in migrate' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:764:in up' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/migration.rb:742:in migrate' /Library/Ruby/Gems/2.0.0/gems/activerecord-4.0.0/lib/active_record/railties/databases.rake:42:in `block (2 levels) in ' Tasks: TOP => db:migrate (See full trace by running task with --trace)

+0

您已收到答案:'的SQLite3 ::的SQLException:你已经提供了足够的细节来判断你为什么创建了这个表,也许你已经手工创建了它,也许它是由另一个迁移创建的,谁知道。 – zrl3dx

+0

哦,现在我看到了,我是Rails的新手,我如何重新创建或删除已存在的表? –

+0

好办法是使用迁移对db进行的所有更改,以便以后不会丢失。我不知道你是想从头开始创建表还是修改它,后一个应该使用'add_column:table_name,:column_name,:column_type'语法 – zrl3dx

回答

1

正如我写的评论,您收到因为这个错误:

SQLite3::SQLException: table "employees" already exists 

这意味着您已经在数据库中拥有该列。您可以解决在几个方面:

  • 改变迁移修改,而不是创造:

    class CreateEmployees < ActiveRecord::Migration 
        def self.up 
        add_column :employees, :name, :string 
        (...) 
        end 
        end 
    
        def self.down 
        remove_column :employees, :name 
        end 
    end 
    
  • 添加另一个迁移将下降全表(显然,一个人应该比前面的时间戳从控制台手

    class RemoveEmployees < ActiveRecord::Migration 
        def change 
        drop_table :employees 
        end 
    end 
    
  • 降表,但是这并不是一个非常:修改一个这样的表将首先被再度回落,然后创建)不错的选择,因为你应该学习使用迁移来改变你的数据库,当然这将是最快的一个(如果你知道如何使用控制台)并且不会造成任何伤害,但如果这只是一些学习项目,尽可能地学习良好的习惯。

你也可能需要使用新的语法(据我所知)的def change代替self.upself.down,少字母键入并减少重复;)

0

你跑了,移民已经在它的错误。所以迁移进行到一半,创建表不完整。回滚该迁移,然后再次运行迁移。

2

您的员工表已经创建在您的数据库中。你需要修复它,那么你可以做到这一点有两种方式1.降数据库,并创建一个或多个2.运行向下迁移然后向上迁移

rake db:drop 
rake db:create 
rake db:migrate