레이크 가이 레일 마이그레이션 오류를 던지는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/234233

  •  04-07-2019
  •  | 
  •  

문제

개발 기계와 생산 기계라는 두 개의 기계가 있습니다. Rails 앱을 처음으로 제작 서버에 가져 왔을 때 아무런 문제가 없었습니다. Rake DB : Schema : Load Rails_env = Production을 실행하여 Schema.rb를 간단히 가져 왔습니다. 모든게 괜찮 았어.

따라서 개발 기계에서 더 많은 변경 사항과 다른 마이그레이션을 한 다음 새 응용 프로그램을 생산 기계에 복사했습니다. 그런 다음 Rake DB : Migrate Rails_env = Production을 실행하여 데이터베이스를 업데이트하려고했습니다. 다음과 같은 오류가 발생합니다. "데이터베이스에는 이미 'schema_migrations'라는 객체가 있습니다."

나는 나 자신에게 생각하고있다, 농담이 없다 ... 당신은 그것을 만들었습니다! 나는 레이크에서 흔적을 달렸다. 그리고 레이크는 그것이 처음으로 운영되었다고 생각하는 것처럼 보인다. 그러나 내 개발 기계와 제작 기계에서 'schema_migrations'테이블을 분석하면 한 가지 마이그레이션의 차이, 즉 마이그레이션하려는 것의 차이가 있음을 알 수 있습니다.

또한 버전 번호를 명시 적으로 정의하려고했지만 작동하지 않습니다.

제작 서버를 최신 상태로 가져올 수있는 방법에 대한 아이디어가 있습니까?

업데이트:

데이터베이스를 '삭제'할 수 없다고 말함으로써 시작하겠습니다. 이미 100K가 넘는 레코드가 약간 넘치는 제작 서버입니다. 미래에 비슷한 문제가 발생하면 어떻게됩니까? AM, 데이터베이스 문제가 발생할 때마다 테이블을 삭제해야합니까? 이번에는 작동 할 수 있지만 모든 데이터베이스 문제에 대한 실질적인 장기 솔루션처럼 보이지는 않습니다. 내가 지금 가지고있는 문제가 나에게 독특하다고 의심합니다.

  1. 'schema_info'테이블처럼 들리고 'schema_migrations'테이블은 동일합니다. 설정에는 'Schema_Migrations'만 있습니다. 앞에서 언급 한 바와 같이, 프로덕션 서버의 'schema_migrations'테이블과 개발 기계의 차이는 하나의 레코드 일뿐입니다. 즉, 마이그레이션하고 싶은 변경의 버전 번호가 포함 된 레코드입니다.

  2. 'Simply Rails 2'를 읽은 책에서, Rake DB : Migrate를 실행하는 대신 프로덕션 서버로 처음으로 이동할 때 Rake : DB : Schema : Load.

  3. 중요하다면 Rails 버전 2.1을 사용하고 있습니다.

올바른 솔루션이 없습니다

다른 팁

이것은 추측입니다. 나는 당신이 DB : Schema : DB 대신로드 : 프로덕션 환경에서 마이그레이션하기 때문에 DB의 구조를 얻었지만 스키마 _info 테이블로 마이그레이션되는 데이터는 없다고 생각합니다. 이제 프로덕션 환경에서 마이그레이션을 실행할 때 Schema_Info에는 데이터가 없으므로 Migrate는 아직 실행되지 않았다고 생각합니다 (그렇지 않기 때문에).

즉, "schema_migrations"테이블을 살펴 보았고 Dev에서 프로덕션에 한 가지 버전의 차이가 있다고 말합니다 ... 몇 달이 지났지 만 그 테이블에 대해 들어 보지 못했습니다. 내 레일 버전 뒤에. 어쩌면 단일 "버전"열이있는 프로덕션 환경에서 "Schema_Info"테이블을 작성하고 프로덕션 환경이 있다고 생각되는 버전이있는 행을 추가 할 수 있습니다.

"데이터베이스에 'schema_migrations'라는 객체가 이미 있습니다. 오류 메시지는 MS SQLServer를 데이터베이스로 사용하고 있다고 생각하십니까? (이것은 MS SQL Server 오류 메시지처럼 보이기 때문에)

그렇다면 어떤 activerecord 데이터베이스 어댑터를 사용하고 있습니까? (Database.yml 파일은 무엇입니까? MS SQL Server 데이터베이스에 액세스하기 위해 어떤 보석을 설치 했습니까?)

현재 Rails는 프로덕션 스키마에서 Schema_Migrations 테이블을 찾지 못하므로 작성하려고 시도하며 데이터베이스 오류 메시지 로이 생성이 실패합니다. 아마도 그 이유는 schema_migrations 테이블 이름의 상위/소문자 일 것입니다. MS SQL Server 식별자를 이해하는 한 사례에 민감합니다.

생산에 사용 된 시스템에 따라 아래가하는 인스턴스를 보았습니다. ~ 아니다 일하다:

rake db:migrate RAILS_ENV=production

그러나 이것이 작동하는 곳은 다음과 같습니다.

RAILS_ENV=production rake db:migrate

기발한, 나는 알고 있지만, 그것이 차이를 만드는지 확인하기 위해 노력할 가치가 있습니다.

업데이트와 관련하여 :

  1. 나는 당신의 생산 schema_migrations와 dev 버전의 차이점이 무엇인지 이해하지 못합니다. 두 테이블 모두에 레코드가 있습니까 (1 열, "버전", 오른쪽이 있어야 함)가 있습니까? 생산 테이블에 레코드가없는 경우 다음을 수행하십시오.

    ActiveRecord::Base.connection.execute("INSERT schema_migrations (version) VALUES(#{my version number that production is supposedly on})")

  2. 또는 제작시 Schema_Migrations 테이블을 완전히 떨어 뜨릴 수 있습니다.

    ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")

    그런 다음 다시 실행됩니다 rake db:migrate RAILS_ENV=production. 그것은 버전 1에서 시작하여 마이그레이션을 실행하지만 아마도 당신이 뒤 따르는 것이 아닐 것입니다.

  3. 또는 대안 적으로, 생산 환경에서 IRB 세션을 시작하고,로드하려는 마이그레이션 파일의 "요구 사항"또는 "로드"(어떤 것을 기억할 수 없음)를 수행 할 수 있습니다. MyMigrationClass.up. 앞으로도 문제가 있지만 빠른 고정 유형의 해킹으로 작동하므로 스키마_migrations 테이블에서 버전 번호를 수동으로 설정해야합니다.

DB를 떨어 뜨리고 다시 추가하고 Rake RB : Migrate를 실행합니다. 브래드는 스키마로드를 실행할 때 Schema_Migrations 테이블에 레코드를 넣지 않았다는 것이 맞습니다.

물론 데이터가있는 경우 프로덕션 서버에서 손실 할 수없는 경우 더 복잡합니다. 레이크 백업 작업 (코어의 일부인지 아닌지 확실하지 않음)을 얻은 다음 Rake DB : Backup : Backup : Production Database에 작성한 다음 생산에서 마이그레이션을 최신 상태로 얻은 후 Rake DB를 실행할 수 있습니다. 백업 : 읽기.

schema_info는 기존 레일에서 나온 것입니다. Schema_Migrations는 블록의 새로운 아이입니다. 더 이상 사용되지 않으므로 schema_info 테이블을 제거 할 수 있어야합니다. 이 이름 변경과 관련된 모든 문제를 검색하고 싶을 것입니다.

레이크 DB : 스키마 :로드는 Schema.rb에서 데이터베이스 구조를로드합니다. 이 파일은 데이터베이스 구조의 현재 표현입니다. 모든 테이블과 색인 생성이 필요한 빈 스키마 (데이터베이스)가있을 때 사용됩니다. 모든 마이그레이션을 실행해야합니다. 데이터가 포함 된 기존 프로덕션 데이터베이스가 있으면 실행하고 싶지 않습니다. 다른 사람들이 말했듯이 그것이 나쁘다!

나는이 게시물이 얼마 전에 있다는 것을 알고 있지만, 나는 그것을 발견했고 실제로 대답하지 않았습니다. Google에서 나타날 때 여기가 간다.

Rake DB : Schema : DUMP (또는 빌드 스크립트에 의해 수행되었을 때)를 수행했을 때 마이그레이션 테이블의 정의를 Schema.rb에 넣을 것입니다. 스크립트가 끝나면 프로세스는 테이블을 다시 만들려고하지만 이미 존재합니다. Rake : Schema : Load에서 실행하기 전에 Schema.rb에서 마이그레이션 테이블을 제거하면 오류 메시지가 없습니다.

마이그레이션 테이블에서 버전 번호를 설정하여 마이그레이션을 실행해야합니다. 따라서 Schema.rb가 어떤 버전과 관련이 있는지 알고 있거나 모든 이전 마이그레이션을 삭제하는 것이 중요합니다 (SCM에 안전하게 맞습니까?)

rake db:migrate RAILS_ENV=production

사용 db:schema:load 첫 번째 생성을 위해서는 점진적인 변화를 마이그레이션해야합니다.

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