通过命令导出你在 database.yml 中设置的数据库的表结构,再生成一个可以生成这个表结构的总 migration。
作用的话可以加快你初始化数据库的过程。你挨个跑 migration 的话,除了 create_table 中间会有项目开发中的 rename,remove,add 等操作,而 schema 是直接把这些操作的结果汇总起来。
另外如果您把 schema 纳入了版本控制,那么 diff 一下你就可以知道自己在本地对数据库进行了哪些 migrate 操作。
schema 和 migration 的顺序完全没有关系。有个细节,就是如果你有使用外键约束,那么 add_foreign_key 会在 schema 的最后,防止你创建约束的时候,这个列还没有被生成。你可以看看代码,它是直接通过数据库 dump 命令跑出来的。
mysql
def structure_dump(filename)
args = prepare_command_options
args.concat(["--result-file", "#{filename}"])
args.concat(["--no-data"])
args.concat(["--routines"])
args.concat(["#{configuration['database']}"])
run_cmd('mysqldump', args, 'dumping')
end
pg
def structure_dump(filename)
set_psql_env
search_path = case ActiveRecord::Base.dump_schemas
when :schema_search_path
configuration['schema_search_path']
when :all
nil
when String
ActiveRecord::Base.dump_schemas
end
args = ['-s', '-x', '-O', '-f', filename]
unless search_path.blank?
args += search_path.split(',').map do |part|
"--schema=#{part.strip}"
end
end
args << configuration['database']
run_cmd('pg_dump', args, 'dumping')
File.open(filename, "a") { |f| f << "SET search_path TO #{connection.schema_search_path};\n\n" }
end