2011-05-04 3 views
1

내가 (DataMapper를 통해) 기존 데이터베이스 스키마의 테이블에 몇 가지 필드를 삽입, 내가지고있어 다음레일즈 3 : DataObjects :: SQLError - * 경고 *에서 오류가 발생하지 않게하려면 어떻게합니까?

DataObjects::SQLError "Field 'activationcode' doesn't have a default value" 

는 실제로 해당 필드에 대한 값을 지정하지만하지 않았다 기본 DB 스키마 (MySQL)에는 하나도 설정되어 있지 않습니다. 이것은 실제로 문제를 일으키지 않습니다. 단지 MySQL이 삽입을 수행하지만 완료 후에 "경고 : 1"을 보여줍니다. 이 경고는 레일스가 인서트를 정지시키고 롤백하게하는 원인이됩니다. 나는이 필드를 고칠 수 있다는 것을 알고 있지만 더 많은 수천이 있으며 나는 진정한 SQL 에러에 대해서만 경고하고 경고를하지 않고 DataObjects를 얻을 수있는 방법이 있는지 알아보고자한다.

레일 3.0.7, 루비 1.9.2, DataMapper이 문제를 해결해야하는 피할 수없는 가난한 영혼을 위해 1.1.0

답변

4

...

문제는 JDBC가 (인이다 DataObjects가 래핑하는 것)은 MySQL 변수 sql_mode을 조정하고 이것을 TRADITIONAL으로 설정합니다.이 동작은 MySQL에 추가됩니다. DataMapper를 사용하기 전에 응용 프로그램의 아무 곳이나 실행 취소해야합니다 (한 번만 수행하면됩니다). sql_mode 이후

repository(:default).adapter.execute("SET sql_mode = ''") 

이상적으로 당신은 아마 목록에서 TRADITIONAL을 제거하기 위해 스마트 뭔가를 원하지만 위의 신속하고 더러운 솔루션입니다 모드의 쉼표로 구분 된 목록이 될 수 있습니다.

업데이트 : 원인이되는 것은 단지 TRADITIONAL 플래그가 아닙니다. 그것은 TRADITIONAL, STRICT_ALL_TABLES 및 STRICT_TRANS_TABLES입니다. 나는 JDBC가 구성한 것을 검사하고 시행 착오를 통해 문제가되는 모드를 제거했다. WARNING = ERROR 동작을 생성하지 않는 결과 목록은 다음과 같습니다.

REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_UNSIGNED_SUBTRACTION,NO_DIR_IN_CREATE,ANSI,NO_BACKSLASH_ESCAPES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION