db:migrate
首先,确保你已经配置好了database.yml,假设我们要创建一个名为person的model,现在我们可以通过db:migrate任务来避免直接使用SQL来操作数据库:
rails g model person name:string age:int
这条命令将在你的db/migrate目录下创建001_create_people.rb文件,我们可以通过它来创建people(people是person的复数)表:
$ rake db:migrate
== CreatePeople: migrating ===================
-- create_table(:people)
-> 0.1900s
== CreatePeople: migrated (0.1900s) ==========
现在,你会发现你的数据库中已经多了一个people表,它包含3个字段:id,name,age,如果你不需要那个自动创建的id字段,那么你可以修改001_create_people.rb,在create_table :people后面加上:id => false即可。
如果随后你发现你需要再增加一个学位字段,也很简单:
$ rails g migration add_degree_to_people
== AddDegreeToPeople: migrating ============
-- add_column(:people, :degree, :string)
-> 0.3400s
== AddDegreeToPeople: migrated (0.4100s) ===
这将在db/migrate目录下创建002_add_degree_to_people.rb文件,对它进行编辑:
class AddDegreeToPeople < ActiveRecord::Migration
def self.up
add_column :people, :degree, :string
end
def self.down
remove_column :people, :degree
end
end
然后再次执行rake db:migrate,现在你会发现people表已经多了一个degree字段。
事实上除了add_column,我们还可以对数据库进行更多的操作:
create_table(name, options),创建表
drop_table(name),删除表
rename_table(old_name, new_name),重命名表
add_column(table_name, column_name, type, options),添加列
rename_column(table_name, column_name, new_column_name),重命名列
change_column(table_name, column_name, type, options),改变列属性
remove_column(table_name, column_name),删除列
add_index(table_name, column_name, index_type),创建索引
remove_index(table_name, column_name),删除索引
唯一需要注意的就是:必须在down方法中撤销up方法对数据库所作的一切更改,以保证我们所有的迁移都是可逆的。
比如,假设我们现在想从people中去除degree字段,那我们只需要执行下面这条语句就可以了:
$ rake db:migrate version=1
如果我们连people表也不需要了,那就执行:
$ rake db:migrate version=0
另外,除了db:migrate,还有两个比较有用的操作数据库的rake任务:
rake db:schema:dump,这将在db目录下创建一个schema文件,你可以通过复制它的内容来为数据库中现有的表创建migration文件(如果你的应用不是一开始就使用db:migrate的话)
rake db:structure:dump,这将在db目录下创建一个structure文件,它包含创建当前数据库结构所需的SQL语句。
rails g model person name:string age:int
这条命令将在你的db/migrate目录下创建001_create_people.rb文件,我们可以通过它来创建people(people是person的复数)表:
$ rake db:migrate
== CreatePeople: migrating ===================
-- create_table(:people)
-> 0.1900s
== CreatePeople: migrated (0.1900s) ==========
现在,你会发现你的数据库中已经多了一个people表,它包含3个字段:id,name,age,如果你不需要那个自动创建的id字段,那么你可以修改001_create_people.rb,在create_table :people后面加上:id => false即可。
如果随后你发现你需要再增加一个学位字段,也很简单:
$ rails g migration add_degree_to_people
== AddDegreeToPeople: migrating ============
-- add_column(:people, :degree, :string)
-> 0.3400s
== AddDegreeToPeople: migrated (0.4100s) ===
这将在db/migrate目录下创建002_add_degree_to_people.rb文件,对它进行编辑:
class AddDegreeToPeople < ActiveRecord::Migration
def self.up
add_column :people, :degree, :string
end
def self.down
remove_column :people, :degree
end
end
然后再次执行rake db:migrate,现在你会发现people表已经多了一个degree字段。
事实上除了add_column,我们还可以对数据库进行更多的操作:
create_table(name, options),创建表
drop_table(name),删除表
rename_table(old_name, new_name),重命名表
add_column(table_name, column_name, type, options),添加列
rename_column(table_name, column_name, new_column_name),重命名列
change_column(table_name, column_name, type, options),改变列属性
remove_column(table_name, column_name),删除列
add_index(table_name, column_name, index_type),创建索引
remove_index(table_name, column_name),删除索引
唯一需要注意的就是:必须在down方法中撤销up方法对数据库所作的一切更改,以保证我们所有的迁移都是可逆的。
比如,假设我们现在想从people中去除degree字段,那我们只需要执行下面这条语句就可以了:
$ rake db:migrate version=1
如果我们连people表也不需要了,那就执行:
$ rake db:migrate version=0
另外,除了db:migrate,还有两个比较有用的操作数据库的rake任务:
rake db:schema:dump,这将在db目录下创建一个schema文件,你可以通过复制它的内容来为数据库中现有的表创建migration文件(如果你的应用不是一开始就使用db:migrate的话)
rake db:structure:dump,这将在db目录下创建一个structure文件,它包含创建当前数据库结构所需的SQL语句。