ProgramingTip

db : test : clone, db : test : clone_structure, db : test : load 및 db : test : prepare의 차이점은 무엇입니까?

bestdevel 2020. 10. 27. 23:03
반응형

db : test : clone, db : test : clone_structure, db : test : load 및 db : test : prepare의 차이점은 무엇입니까?


레일과 데이터베이스를 처음 접하는 사람에게는 rubyonrails.org의 공식 설명이이 네 가지 작업이 모두 똑같이 들린다는 사실을 인정해야합니다. 인용문 :

rake db:test:clone  Recreate the test database from
                    the current environment’s database schema

rake db:test:clone_structure    Recreate the test database from the
                                development structure

rake db:test:load   Recreate the test database from the current schema.rb

rake db:test:prepare    Check for pending migrations and load the test schema

나는 구조와 스키마의 차이도 모른다. 그리고 현재 환경의 스키마를로드하는 것과 스키마 .rb를로드하는 것의 차이점은 무엇입니까?

적절한 작업은 얼마나 유사하거나 다른가요?


아주 좋은 질문입니다. 그래서 난 레일 소스에 싸웠습니다 . 이제 더 명확 해졌습니다.database.rake

  • db:test:clonedb:schema:dump의 조합 일뿐입니다 db:test:load.

    task :clone => %w(db:schema:dump db:test:load)
    
  • db:test:clone_structure다음 {rails_env}_structure.sql파일을 사용 합니다.

    task :clone_structure => [ 'db:structure:dump', 'db:test:purge' ] do
      # skipped some code, here's what happens for MySQL:
      ActiveRecord::Base.establish_connection(:test)
      # ...
      IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table|
        ActiveRecord::Base.connection.execute(table)
      end
    end
    
  • db:test:load과 동일 db:schema:load하지만 테스트 데이터베이스에서 호출합니다.

    task :load => 'db:test:purge' do
      ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
      # ...
      db_namespace['schema:load'].invoke
    end
    
  • db:test:prepare이 보류 중인지 마이그레이션 여부를 경고하고 오는가 않은 경우 스키마 형식에 따라 실행 db:test:clone_structure( {rails_env}_structure.sql파일 사용) 또는 db:test:load( schema.rb파일 사용) (이것은 나에게 약간 혼란스럽고 다른 사람 이 확장 할 수 있음 )

    task :prepare => 'db:abort_if_pending_migrations' do
      # ...
      db_namespace[{ :sql  => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke
    end
    

이것이 해결되기를 바랍니다! 다시 말하지만, database.rake 파일을 살펴 보는 [해석] 쉽고 다른 질문을 정리할 수 있습니다. 이 링크는 :test네임 스페이스 의 시작 인 줄로 이동 합니다.


완전히 완전히 완전히 완전히 아닙니다. 'schema'라는 단어가 포함 된 모든 작업은 ... / db / schema.rb 파일에서 작동합니다. schema.rb는 모든 마이그레이션을 적용한 후 스키마의 상태입니다. 모든 db 마이그레이션을 실행하는 대신 스키마를 복원하기 위해 사용 가능합니다 (마이그레이션이 경우 시간이 오래 걸릴 수 있음).

'structure'라는 단어가 포함 된 모든 작업은 {Rails.env} _structure.sql 파일에서 작동합니다. 이 파일은 스키마에 schema.rb 파일에서 표현할 수없는 구문이 포함되어있을 때 사용됩니다. 예를 들어 특정 RDBMS에 기능을 사용하는 경우입니다. 내부적으로 Rails는 RDBMS에있는 스키마 기능 유틸리티를 사용하여이 파일을 생성합니다. 스키마를 복원하기 위해 RDBMS 관련 도구를 사용하여 파일을 읽고 SQL 문을 다시 실행합니다.

Rails는 설정 여부에 따라 schema.rb 경로 또는 structure.sql 경로로 선택할지 여부를 알고 있습니다.

config.active_record.schema_format = : sql

... / 설정 / application.rb에서

참고 URL : https://stackoverflow.com/questions/7693365/whats-the-difference-between-dbtestclone-dbtestclone-structure-dbtestlo

반응형