문제

Rails / ActiveRecord 2.1.1 사용 경험

  • 예를 들어 ruby ​​script\generate scaffold 제품 제목:문자열 설명:텍스트 image_url:문자열을 사용하여 첫 번째 버전을 생성합니다.
  • 예를 들어 20080910122415_create_products.rb라는 마이그레이션 파일이 생성됩니다.
  • rake db: migration을 사용하여 마이그레이션을 적용합니다.
  • 이제 ruby ​​script\generate migration add_price_to_product 가격:decimal을 사용하여 제품 테이블에 필드를 추가합니다.
  • 그러면 20080910125745_add_price_to_product.rb라는 마이그레이션 파일이 생성됩니다.
  • rake db: migration을 실행하려고 하면 실제로 첫 번째 마이그레이션이 되돌려지고 다음 마이그레이션이 적용되지 않습니다!그러면 귀하의 제품 테이블이 파괴될 것입니다!
  • 하지만 rake를 단독으로 실행했다면 하나의 마이그레이션이 보류 중이라는 메시지가 표시되었을 것입니다.

rake db: migration을 적용하면(테이블이 삭제된 후) 모든 마이그레이션이 순서대로 적용됩니다.

내가 찾은 유일한 해결 방법은 다음과 같이 새 마이그레이션 버전을 지정하는 것입니다.

rake db:migrate version=20080910125745

그래서 나는 궁금합니다 :이것이 예상되는 새로운 동작입니까?

도움이 되었습니까?

해결책

당신은 사용할 수 있어야합니다

rake db:migrate:up 

강제로 진행하지만 팀의 다른 사람들이 인터리브한 마이그레이션을 놓칠 위험이 있습니다.

당신이 달리면

rake db:migrate 

두 번 클릭하면 모든 마이그레이션이 다시 적용됩니다.

SQLite를 사용하는 Windows에서도 동일한 동작이 발생합니다. 이는 해당 환경에 특정한 버그일 수 있습니다.

편집하다 -- 이유를 찾았습니다.Railstie Database.rake 작업에는 다음 코드가 있습니다.

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
task :migrate => :environment do
  ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
  ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
  Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end

그런 다음 내 환경 변수에는

echo %Version% #=> V3.5.0f

루비에서

ENV["VERSION"] # => V3.5.0f
ENV["VERSION"].to_i #=>0 not nil !

따라서 레이크 작업은 다음을 호출합니다.

ActiveRecord::Migrator.migrate("db/migrate/", 0)

ActiveRecord::Migrator에는 다음이 있습니다.

class Migrator#:nodoc:
  class << self
    def migrate(migrations_path, target_version = nil)
      case
        when target_version.nil?              then up(migrations_path, target_version)
        when current_version > target_version then down(migrations_path, target_version)
        else                                       up(migrations_path, target_version)
      end
    end

예, rake db:migrate VERSION=0 의 긴 버전입니다 rake db:migrate:down

편집하다 - 등대 버그를 업데이트하려고 하는데 슈퍼 회사 프록시가 거기에 연결하는 것을 금지합니다.

그동안 마이그레이션을 호출하기 전에 버전 설정을 해제해 볼 수 있습니다.

다른 팁

나는 정중하게 Tom의 의견에 동의하지 않습니다!이것 ~이다 버그 !!V3.5.0f는 레이크 마이그레이션에 유효한 버전이 아닙니다.Rake는 Ruby가 "V3.5.0f".to_i가 0이라고 간주하기로 선택했기 때문에 migration:down에 이를 사용해서는 안 됩니다.

Rake는 버전이 유효하지 않다고 큰 불만을 제기하여 사용자와 나 사이에 버전이 정수로 변환하여 버전이 형성 된 타임 스탬프인지 확인하는 것이 약간 가볍다는 것을 확인해야합니다).

[댓글을 달 수 없는 빌어먹을 IE6!아니요, 브라우저를 변경할 수 없습니다. 감사합니다.]

이는 예상된 동작이 아닙니다.나는 이것을 Lighthouse의 버그로 보고할 것을 제안하려고 했는데, 당신이 그렇게 하신 것 같습니다. 이미 그랬어!OS/데이터베이스/Ruby 버전을 포함한 추가 정보를 제공해 주시면 살펴보겠습니다.

여자 이름,

조사해 주셔서 감사합니다.당신 말이 맞습니다. 그리고 실제로 내 생각에는 당신이 '디자인 버그'라는 더 심각한 버그를 발견한 것 같습니다.

무슨 일이 일어나고 있는지는 rake가 명령줄에 전달하는 모든 값을 가져와 환경 변수로 저장한다는 것입니다.결국 호출될 rake 작업은 환경 변수에서 이 값을 가져옵니다.db: migration이 ENV["VERSION"]을 쿼리할 때 실제로는 rake를 호출하여 설정한 버전 매개변수를 요청합니다.rake db: migration을 호출하면 어떤 버전도 전달되지 않습니다.

하지만 다른 프로그램에서 다른 목적으로 설정한 VERSION이라는 환경 변수가 있습니다(아직 어떤 프로그램인지는 모르겠습니다).그리고 rake 뒤에 있는 사람들(또는 Database.rake 뒤에 있는 사람들)은 이런 일이 일어날 것이라고는 생각하지 못했습니다.그것은 디자인 버그입니다.최소한 "VERSION" 대신 "RAKE_VERSION" 또는 "RAKE_PARAM_VERSION"과 같은 보다 구체적인 변수 이름을 사용할 수 있었습니다.

Tom, 저는 확실히 닫지는 않겠지만 이러한 새로운 발견을 반영하기 위해 Lighthouse에 대한 버그 보고서를 편집하겠습니다.

그리고 도움을 주신 Jean에게 다시 한 번 감사드립니다.나는 이 버그를 5일 전 등대에 게시했지만 여전히 답변을 받지 못했습니다!

롤로

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top