新手问题 ruby schema.rb 文件是干什么用的

ThanksSirAlec · 2018年01月03日 · 最后由 adamshen 回复于 2018年01月04日 · 4120 次阅读

背景:在项目里项目里看到了一个 example model,但是在 app/db/migrate 文件夹里面没有发现 ********* create_examples.rb 的文件。 只在 schema 里面发现了

create_table "example" do |t|
  *
  *
  *
end

这样一个块。

求大佬解释一下

也许有人忘了提交。不过你依然可以使用rake db:schema:load创建表结构。

有可能有人自己用 SQL 创建了一张表,或者还没有把新建 migration 提交上来,造成了 schema 和 migrate 不同步的问题。

也有可能一个 migration 中创建了多个表

adamshen 回复

所以我想问一下 schema 是干什么用的,我入坑 rails 才两个月,不是很懂这文件是干什么用的

ThanksSirAlec 回复

通过命令导出你在 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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号