2012-06-28 1 views
2

Grails Database Migration Plugin에 익숙해지며 this site을 참조하십시오. null이 아닌 제약 조건을 가진 속성을 추가하려고 할 때 문제가 발생했습니다. 내 데이터베이스를 업데이트 할Grails 데이터베이스 마이그레이션 플러그인이 자동으로 null이 아닌 제약 조건을 추가하지 못합니다.

databaseChangeLog = { 
    changeSet(author: "Ryan (generated)", id: "1340893788251-1") { 
     addColumn(tableName: "game") { 
      column(name: "genre", type: "varchar(255)") 
     } 

     grailsChange{ 
      change{ 
       sql.executeUpdate("UPDATE game SET genre = 'Other'") 
      } 
     } 

     addNotNullConstraint(tableName: "game", columnName: "genre") 
    } 
} 

:이 (다음 컬럼에 널 (NULL) 입력이 불가능한 제약 조건을 추가, 열을 추가 기존 레코드에 대한 기본값을 설정) 사이트에 표시됩니다 나는 내 스크립트 같은 방식으로 모델링 그것은 조용히 실패합니다. 그래서 세 가지 변경 사항을 세 가지 다른 그루비 스크립트로 나눠서 문제를 추적합니다.

databaseChangeLog = { 
    changeSet(author: "Ryan (generated)", id: "1340893788251-1") { 
     addColumn(tableName: "game") { 
      column(name: "genre", type: "varchar(255)") 
     } 
    } 
} 

두 번째 파일 (기존 레코드에 대한 기본 값을 지정) 괜찮 았는데 :

는 는

첫 번째 파일 (열을 추가는) 잘 작동

databaseChangeLog = { 
    changeSet(author: "Ryan (generated)", id: "defaultValue") { 
     grailsChange{ 
      change{ 
       sql.executeUpdate("UPDATE game SET genre = 'Other'") 
      } 
     } 
    } 
} 

세 번째 파일 (NOT NULL 제약을 추가) 자동으로 실패 :

databaseChangeLog = { 
    changeSet(author: "Ryan (generated)", id: "notNull") { 
     addNotNullConstraint(tableName: "game", columnName: "genre") 
    } 
} 

로그 파일에는 플러그인과 관련된 내용 만 표시됩니다.

2012-06-28 10:17:11,694 [main] INFO liquibase - Successfully acquired change log lock
2012-06-28 10:17:11,972 [main] INFO liquibase - Reading from DATABASECHANGELOG
2012-06-28 10:17:11,980 [main] INFO liquibase - Reading from DATABASECHANGELOG
2012-06-28 10:17:12,009 [main] INFO liquibase - Successfully released change log lock

databasechangelog 테이블을 검사하면 스크립트가 실행되지 않은 것을 알 수 있습니다.

| Starting dbm-update for database root @ jdbc:mysql://localhost/migration

하지만 성공적인 업데이트를 참조처럼 더

| Finished dbm-update

없다 : 콘솔은 저에게이했다.

참고 : 참고로 사용하고있는 사이트는 버전 1.0을 사용하고 있으며 버전 1.1을 사용하고 있습니다. 나는이 플러그인의 튜토리얼이나 예제를 찾는 데 어려움을 겪고있다. 가장 최근 버전의 정보를 찾기가 더 힘들다.

누구나 not null 제약 조건이 잘못 될 수 있습니까?

+0

제약 조건이 적용되지 않았기 때문에 버그 인 것 같습니다. 실제로 실행중인 SQL이 실패하는지 여부를 알고 있습니까? – cdeszaq

+0

cdexzaq가 말한 것에 약간의 확장을하기 위해'alter table game modify genre varchar (255) not null;'을 MySQL 데이터베이스에 직접 실행하면 에러가 발생합니까? – proflux

+0

@cdeszaq @proflux'테이블 게임 수정 장르 varchar (255) not null;은 아마도 작동했을 것입니다. 다른 방법으로 문제를 디버깅했습니다 (아래 내 답변 참조). – Weezle

답변

4

점심 시간에 나는 이것에 대해 생각하고 있었고 왜 명백한 디버깅 단계를 취하지 않았는지 궁금해했습니다. 그루비 스크립트 변경은 처음부터 변경되었습니다. 왜하지 grails dbm-gorm-diff를 실행하고 플러그인이 함께 제공됩니다 것을 볼 수 ...

class Game { 
    String genre 

    static constraints = { 
     genre(nullable: false, blank: false) 
    } 
} 

: 열을 추가하는 업데이트는 내 DB 내 도메인 객체 사이의 유일한 차이는 널 (NULL) 입력이 불가능한 제약 것을 의미했다 ?

결과는 다음이었다

만든 플러그인이 있었다 내 생성 변경 스크립트와 스크립트의 유일한 차이점
databaseChangeLog = { 
    changeSet(author: "Ryan (generated)", id: "1340897310305-1") { 
     addNotNullConstraint(columnDataType: "varchar(255)", columnName: "genre", tableName: "game") 
    } 
} 

:
columnDataType : "VARCHAR는 (255)"

내가 추가 그건 내가 만든 스크립트 (그냥 내가 틀린 일을 잘못하지 않았 음)와 빙고, 업데이트가 작동했음을 의미합니다.